下記のプログラムをご覧ください
public class TestVolatile implements Runnable {
public static volatile int counter;
public static String lock = "lock";
public static void main(String[] args) {
Thread t1 = new Thread(new TestVolatile(),"Thread-1");
Thread t2 = new Thread(new TestVolatile(),"Thread-2");
t1.start();
t2.start();
}
public void run() {
synchronized(this) {
System.out.println(Thread.currentThread()+"-"+counter);
counter++;
}
}
}
このプログラムを複数回実行すると、3 つの異なる結果が得られます。
最初は
スレッド[スレッド-1,5,メイン]-0
スレッド[スレッド-2,5,メイン]-0
2番目は
スレッド[スレッド-1,5,メイン]-0
スレッド[スレッド-2,5,メイン]-1
3番目は
スレッド[スレッド-1,5,メイン]-1
スレッド[スレッド-2,5,メイン]-0
しかし、ロック オブジェクトを「this」から「lock」に変更すると、2 つの異なる結果が得られます。
最初は
スレッド[スレッド-1,5,メイン]-0
スレッド[スレッド-2,5,メイン]-1
2番目は
スレッド[スレッド-1,5,メイン]-1
スレッド[スレッド-2,5,メイン]-0
プログラムを書くときの私の仮定は、どちらの場合でも、両方のステートメントで「カウンター」が決して0になるべきではないということでした。
誰か説明できますか?