volatile は Java でどのように可視性を保証していますか?
Java言語では、volatile修飾子は共有変数の可視性を保証するために使用されます。共有変数がvolatileとして宣言された場合、変数への変更は他のスレッドによって即座に見えます。つまり、変数にアクセスするたびに、主メモリから最新の値を読み取ります。
マルチスレッド環境では、各スレッドは独自のワーキングメモリを持ち、共有する変数の自分のコピーを格納しています。スレッドが共有する変数の値を変更した場合、volatile キーワードによる宣言を行わないと、他のスレッドはその変更をすぐに認識できず、ワーキングメモリ中のコピーを引き続き使用します。
volatile で宣言された共有変数は、変数への全ての操作が原子操作(他のスレッドに切り替わることなく、一斉に処理される操作)になるため、あるスレッドでの変更が他のスレッドからも確実に参照できます。
volatileは可視性を保証するのみで、原子性を保証しない点に注意。共有変数の操作が複数の操作から構成される場合、volatileでは原子性を保証できないため、synchronizedを利用するか、アトミッククラスを利用して操作の原子性を保証する必要がある。