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