Java 同時実行チュートリアルには、次のように記載されています。
読み取りと書き込みは、参照変数とほとんどのプリミティブ変数 (long と double を除くすべての型) に対してアトミックです。
読み取りと書き込みは、volatile と宣言されたすべての変数 (long 変数と double 変数を含む) に対してアトミックです。
これをテストするための簡単な実験を作成しました
package experiment0;
public class Experiment0 {
public static int i=9;
public static void main(String[] args) {
i=9;
(new Thread(){
public void run(){
while(i==9){
//System.out.println("i==9");
}
System.out.println("\ni!=9");
}
}).start();
(new Thread(){
public void run(){
try{
Thread.sleep(3000);
i=8;
}catch(Exception e){
}
}
}).start();
}
}
このコードを実行すると、プログラムが終了することはありません! それが機能するためには、最初のスレッドの while ループ内の行のコメントを解除するか、i
として宣言する必要がありvolatile
ます。何か不足していますか?この種のケースでは、すべてのプリミティブを揮発性として宣言する必要があると言うべきですか? System.out
問題を「解決」するために書き込みを行うのはなぜですか? 2番目のスレッドが変更されるのに十分な時間を与えますi
か?