volatile
Javaでの変数の使用について読んでいます。システム内のさまざまなコア/プロセッサで実行されているすべてのスレッドに対する最新の更新を即座に確認できることを理解しています。ただし、これらの更新の原因となった操作の原子性は保証されません。以下の文献がよく使われているのを見かけます
揮発性フィールドへの書き込みは、同じフィールドのすべての読み取りの前に発生します。
これは私が少し混乱しているところです。これは、クエリをよりよく説明するのに役立つコードのスニペットです。
volatile int x = 0;
volatile int y = 0;
Thread-0: | Thread-1:
|
if (x==1) { | if (y==1) {
return false; | return false;
} else { | } else {
y=1; | x=1;
return true; | return true;
} | }
x & y は bothvolatile
であるため、次の先行発生エッジがあります。
- スレッド 0 での y の書き込みとスレッド 1 での y の読み取りの間
- スレッド 1 での x の書き込みとスレッド 0 での x の読み取りの間
これは、どの時点でも、「else」ブロックに入れることができるスレッドは1つだけであることを意味しますか(読み取りの前に書き込みが発生するため)?
Thread-0 が起動し、x をロードし、その値が 0 であることを検出し、else ブロックに y を書き込む直前に、y をロードする Thread-1 へのコンテキスト スイッチがあり、値が 0 であることを検出する可能性があります。したがって、else ブロックにも入ります。そのようなコンテキストの切り替えを防ぎますかvolatile
(非常にありそうにないようです)?