ここには、3 つの単純なクラスがあります。
クラス 1:
public class ThreadSyncMain {
public static int count = 0; // volatile is not use
public static void main(String[] args) {
Thread thread1 = new Thread( new Thread1(),"Thread1" );
Thread thread2 = new Thread( new Thread2(),"Thread2");
thread1.start();
thread2.start();
}
}
クラス 2:
public class Thread1 implements Runnable{
public void run() {
System.out.println("Thread1 Count :: "+ThreadSyncMain.count);
ThreadSyncMain.count++;
}
}
クラス 3:
public class Thread2 implements Runnable{
public void run() {
System.out.println("Thread2 Count :: "+ThreadSyncMain.count);
}
}
出力は次のとおりです。
スレッド 1 カウント :: 0
スレッド 2 カウント :: 1
これは、thread1 が count の値を変更したことを意味します。「揮発性」キーワードを使用していないため、スレッド1の変更がスレッド2に影響するのはなぜですか。このシナリオでは「揮発性」キーワードは問題ではありませんか? 「揮発性」をテストするためにコードを変更するにはどうすればよいですか?
前もって感謝します。
更新部分:いくつかのヒットテストと試行テストを行った後、コードを更新しています。クラス1はそのまま。更新されたコードは次のとおりです。
クラス 2: 100 ミリ秒の遅延を追加しました。
public class Thread1 implements Runnable{
public void run() {
System.out.println("Thread1 Count :: "+ThreadSyncMain.count);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
ThreadSyncMain.count++;
}
}
クラス 3: while ループを追加。内部では、カウントが継続的に監視されます。
public class Thread2 implements Runnable{
public void run() {
while(true)
{
if(ThreadSyncMain.count == 1)
{
System.out.println("Thread2 Count :: "+ThreadSyncMain.count);
}
}
}
}
この状況で、次の出力が得られました
。 1. class1 で「volatile」が使用されていない場合の出力
Thread1 Count :: 0
2. class1 で「volatile」が使用されている場合、出力は次のようになります。
Thread1 Count :: 0
Thread2 Count :: 1
Thread2 Count :: 1
Thread2 Count :: 1
.
.
.
このシナリオで volatile が登場するのはなぜですか?