これで悪いことをしている場合は申し訳ありませんが、この質問のスピンオフである質問があります:
java 5+のvolatileがキャッシュされた変数のコピーをメインメモリと同期しないのはなぜですか?
基本的に、変数volatile
から を削除するとどうなるかを見たかったのです。a
私の変更が適用された元の質問のコードは次のとおりです。
public class Test {
//volatile static private int a;
static private int a;
static private int b;
public static void main(String [] args) throws Exception {
for (int i = 0; i < 100; i++) {
new Thread() {
@Override
public void run() {
int tt = b; // makes the jvm cache the value of b
while (a==0) {
}
//some threads never get here (past the a==0 loop)
if (b == 0) {
System.out.println("error");
}
}
}.start();
}
b = 1;
a = 1;
}
}
私のラップトップ (Win 7 64、JVM ビルド 1.7.0_04-b22) で何が起こるかというと、volatile
. コンソール出力をさらに追加すると、100 個のスレッドのほとんどが最終的にa
から0
への変更を認識しますが、ループ1
を実行し続ける少数 (10 未満) が常に残っていることがわかりました。a==0
私の質問は、これらのスレッドも最終的にその変更を確認するのでしょうか? はいの場合、同様のスレッドの大部分と比較して、それを行うのに数万倍の時間がかかるのは正常ですか? どうして?