私は、Dataインスタンスへの参照を共有する複数のスレッドを持つサーバーを持っているとします。クイック例えば、同期メソッドとReentrantLock
EDIT1:可読性
public void main() {
Data data = new Data();
ReentrantLock rl = new ReentrantLock(true);
ReadThread t1 = new ReadThread(data, rl);
UploadThread t2 = new UploadThread(data, rl);
t1.start(); t2.start();
}
class ReadThread extends Thread {
private Data data;
private ReentrantLock lock;
ReadThread(Data d, ReentrantLock l){ data = d; lock = l; }
void run(){
lock.lock();
try{
data.put(aString)
} finally { lock.unlock(); }
}
}
class UploadThread extends Thread {
private Data data;
private ReentrantLock lock;
UploadThread(Data d, ReentrantLock l){ data = d; lock = l; }
void run(){
lock.lock();
try{
data.put(aString)
} finally { lock.unlock(); }
}
}
用に更新は、それが良い上記のようなロックを使用し、以下のようなputメソッドを同期させることです
class Data {
private LinkedList<String> data = new LinkedList<String>();
synchronized void put(String x){ data.add(x); }
}
これはかなり荒れている、
私は、ほとんどの場合、並行性について懸念しています。
同期メソッドでは、クラス "データ"インスタンス/オブジェクトで同期が発生すると仮定して正しいですか?したがって、1つのUploadThreadがプッシュプロシージャ/メソッドを呼び出すことができ、1つのReadThreadが同じ手順を並行して実行できます。しかし、ReentrantLockの例を使用すると、一度に1つのスレッドだけがput呼び出しを実行できますか?
「データ」クラスでLinkedListを静的にして、putメソッドを同期させて静的にした場合はどうなりますか?どのアプローチが最適ですか?物事を静かにすると、私はmut exを失うのですか?
「ロック」が間違っています。それを考えると、 'synchronized'を使います。またはもっと読む。はるかに。 –
また、 'extends Thread'を使わないでください。 –
また、コードを書式設定します。お願いします。これは判読不能に近いです。 –