The King's Museum

ソフトウェアエンジニアのブログ。

『Java の理論と実践: volatile を扱う』を読んで

記事: Javaの理論と実践: volatile を扱う

メモ:

  • 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:安価な読み書きロック(高度な利用例)

(c) The King's Museum