Java volatile修飾子

フィールド値のキャッシュを抑制する - volatile修飾子

マルチスレッド環境では、性能を向上させるために各スレッドがフィールド値を個別にキャッシュすることがあります。元のメモリを読み書きする処理を減らすことで性能を向上させています。

ただし、これはスレッドによって同じフィールドの参照値が異なる危険を防ぐために使われることもあります。値の不一致を避けたい場合は、volatile修飾子を付けることでフィールド値のキャッシュを制限できます。

public class ModVolatile {
  volatile int shareValue;  // キャッシュ対象から除外
}

該当フィールドを操作している箇所をsynchronizedブロック(修飾子)で表現することも可能です。synchronizedブロック内で扱うフィールド値は必ず元のメモリから読み込まれ、再び書き戻されるため、キャッシュの不一致を避けられます。しかし、単純な値の読み書きをsynchronizedブロックで囲むのは冗長なので、このような操作が頻繁に発生する場合はvolatile修飾子を使用します。