メモ:
- Java の言語としての同期化機構
- synchronized
- volatile
- volatile
- volatile はsynchronized の軽量版
- volatile は synchronized より実行時のオーバーヘッドが少ない
- ただし、synchronized を使ってできることの一部しかできない
- ロックの機能
- 相互排除(Mutex)
- 可視性(Visibility)
- volatile は可視性のみ提供
- volatile を使う意義
- 単純さ(コードがすっきり)
- スケーラビリティ
- volatile が使える条件
- その変数への書き込みが、その変数の現在の値に依存しない
- その変数が、他の変数との不等式に使われない
- インクリメント演算には使えない
- Compare and Assignment には使えない
- volatile のパフォーマンス
- 基本事項:JVM の実装に依存するため厳密なことはいえない。以下は一般論。
- volatile 読み込みのパフォーマンスは非 volatile 読み込みのパフォーマンスと同じ程度に低コスト
- volatile 書き込みのパフォーマンスは非 volatile 書き込みのパフォーマンスより大幅に高い。
- 可視性を保証するためメモリーフェンスが動作するため。
- ロックと違ってブロック動作をしないので、全体として少しスケーラビリティがよい
- volatile の利用パターン
- パターン1:ステータスフラグとしての利用
- パターン2:1度だけ安全に公開する
- パターン3:独立した観測結果の公開
- パターン4:volatile bean パターン
- パターン5:安価な読み書きロック(高度な利用例)