私は次のコードを持っている:Javaの同期スレッド値の更新方法
boolean signal;
@Test
public void test() throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (!signal){
// empty loop body
}
}
});
thread.start();
Thread.sleep(1000);
signal = true;
thread.join();
}
それはスレッドでsignal
変数のローカルコピーの作成による無限ループを実行します。 signal
変数をvolatile
にすることで修正できることはわかっています。
boolean signal;
@Test
public void test() throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (!signal){
synchronized (this) {
}
}
}
});
thread.start();
Thread.sleep(1000);
signal = true;
thread.join();
}
をは、スレッド内の私のsignal
値を更新する方法:(でも空の)私のループ内ブロックを追加した場合だけでなく、ループが正常に終了することができますか?
2つ目のプログラムが決して終了しないようにするには、合法的です。JVM/CPUアーキテクチャは、JLSが要求するよりも強力なメモリモデルを適用するようです。 – assylias
面白い読み込み:https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/ –
彼は、https://shipilev.net/blog/2016/close-encounters- of-jmm-kind /#wishful-unobserved-sync – assylias