Skip to content

Instantly share code, notes, and snippets.

@j5ik2o
Last active August 29, 2015 13:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save j5ik2o/10570854 to your computer and use it in GitHub Desktop.
Save j5ik2o/10570854 to your computer and use it in GitHub Desktop.
Javaメモリモデルについて
  • 通常変数
    • 変数の値の再代入が可能。
  • final
    • 変数の値の再代入が禁止。
    • finalフィールドはコンストラクタが完了した時点で複数のスレッドから可視となる。
  • volatile
    可視性のみを保証する(ロックを獲得しない)。
    • コスト: 読み込みはNormalと同程度で、書き込みはNormalより高い(メモリバリアのため)
    • 可視性: ○
      • スレッド内での共有変数への書き込みを、ほかのスレッドにも反映させる必要がある場合に利用する。
    • 原始性: ×
      • これ自体でアトミック性を保証しない。
    • 正しく利用するための条件
      • その変数への書き込みが、その変数の現在の値に依存しない。
      • その変数が、他の変数との不変式に使われていない。
  • synchronized
    相互排除と可視性を保証する。リード・モディファイ・ライトやチェック・ゼン・アクトなどを一塊の操作にすることができる。
    • 原始性: ○
      • ロックによってアトミック性を保証できる。
    • 可視性: ○
      • モニター解放(MonitorExit)まで行った変更は、後に続くモニター取得(MonitorEnter)で可視となる。
  • 参考リンク
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment