Javaで、次の変数を共有する2つのスレッドがある場合:
int a;
volatile int b;
スレッド1が行う場合:
a = 5;
b = 6;
次に、これら2つの命令の間にStoreStoreバリアが挿入され、「a」がメインメモリにフラッシュバックされます。
スレッド2がそうする場合:
if(b == 6)
a++;
LoadLoadバリアが間に挿入され、「b」の新しい値が表示された場合、「a」の新しい値も表示されることが保証されます。しかし、これは実際にどのように達成されますか?LoadLoadはCPUキャッシュ/レジスタを無効にしますか?または、CPUから再びvolatileから読み取った後の変数の値をフェッチするようにCPUに指示しますか?
LoadLoadバリアに関するこの情報を見つけました(http://gee.cs.oswego.edu/dl/jmm/cookbook.html):
LoadLoadバリアシーケンス:Load1; LoadLoad; Load2は、Load2がアクセスするデータの前に、Load1のデータがロードされ、後続のすべてのロード命令がロードされることを保証します。一般に、明示的なLoadLoadバリアは、投機的ロードや、待機中のロード命令が待機中のストアをバイパスできる順不同の処理を実行するプロセッサに必要です。常に負荷の順序を維持することを保証するプロセッサでは、障壁はノーオペレーションになります。
しかし、これがどのように達成されるかは実際には説明されていません。