私はメソッドを同期させるが、そのオブジェクトレベルのロックを行うと、以下のコードが競合状態を引き起こす理由を説明することができます。 私はクラスレベルを使用する場合は間違いなく動作するので、私はスレッドによって占有されているロックがそれぞれ異なるのではないかと説明してください。Java Concurrencyの同期の問題
/**
*
*/
package lession2.shared.object;
/**
* @author so_what
*
*/
class SharedClass {
private static int sharedData;
public synchronized int getSharedData() {
return sharedData;
}
public synchronized void setSharedData(int sharedData) {
SharedClass.sharedData = sharedData;
}
}
//output of the program should be the distinct numbers
public class StaleDataExample extends Thread {
static SharedClass s1=new SharedClass();
static int counter=0;
public static void main(String args[]) throws InterruptedException {
StaleDataExample t1=new StaleDataExample();
StaleDataExample t2=new StaleDataExample();
StaleDataExample t3=new StaleDataExample();
StaleDataExample t4=new StaleDataExample();
StaleDataExample t5=new StaleDataExample();
StaleDataExample t6=new StaleDataExample();
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
t6.join();
System.out.println();
}
public void run()
{
s1.setSharedData(s1.getSharedData()+1); //read->modify->write operation
System.out.print(s1.getSharedData()+" ");
}
}
'//読み取りを>変更 - >書き込み操作(write-operation)」のみが、「読み出し」と「書き込み」のみが(独立して)同期される。単一のアトミック操作である必要があります。 – tkausl
getとset操作が同じロックを取得していない理由を正当化してください。同じロック複合アトミック性を取得しているためです。 –
同じロックを取得しています。なぜなら、他のスレッドが介入することができる、全く同期していない値を変更するタイムスライスが存在するからです。 – tkausl