記事: Javaの理論と実践: Javaメモリ・モデルを修正する 第1回
メモ:
- Java Memory Model の重要性
- 古いメモリモデルの欠陥
- コンストラクタでの設定値が見えない final フィールド
- リオーダーの存在
- リオーダーとは
- プログラムの意味体系を変えない場合、コンパイラは命令順序を自由に入れ替えられる
- プロセッサーは所定の手続きをふまずに操作を実行できる
- キャッシュはプログラムの書き込みとは異なる順序でメインメモリに反映される
- 新しいメモリモデルを作成(JSR133)
- 非公式な意味体系は簡単に説明できるようになった
- 公式な意味体系は以前難しい
- 同期化と可視性
- 同期化には相互排除(mutex: mutual exclusion)があることは知られている
- メモリ可視性の規則はあまり知られていない
- 同期化ブロックから出る時
- キャッシュをフラッシュ。書込みバリアを実行し、メインメモリに値を書き込む
- 同期化ブロックに入る時
- キャッシュを無効化。読み込みバリアの実行し、メインメモリから値を読み込む
- 問題1:オブジェクトが実は不変ではない
- 古いメモリモデルではオブジェクトが不完全な状態(フィールド値が設定されていない状態)で可視になってしまう
- 問題2:volatile が番兵として使えない
- 古い volatile は読み書きの可視性のみ保持し、通常変数のリオーダーを許していた
- volatile への読み書きは見えるが、他の変数の読み書きは見えないかもしれない
- 新しいメモリモデル
- 開発者にとっての直感性と古いメモリモデルとの互換性を保った新しいモデル