以下の Java の例を考えてみましょう。どちらのクラス メンバー変数も宣言されていないことに注意してくださいvolatile
。メモリ モデルと "前に起こる" ルールを正しく理解している場合、Java 実装はrun()
メソッドを最適化して、別のスレッドがメソッドを呼び出した場合でもメソッドが永久に実行されるようにすることができstopNow()
ます。これは、スレッドに複数回run()
の値の読み取りを強制するメソッドが何もないために発生する可能性があります。stop
あれは正しいですか?そうでない場合、なぜですか?
class Example implements Runnable {
boolean stop = false;
int value = 0;
public void stopNow() {
stop = true;
}
public int getValue() {
return value;
}
@Override
public void run() {
// Loop until stop is set to true.
while (!stop) {
++value;
}
return;
}
}