初心者歓迎! Java相談室 その8
■ このスレッドは過去ログ倉庫に格納されています
0545デフォルトの名無しさん
NGNGJavaのメモリオーダーとロックとvolatileは確かに関係がある。
しかしそんなに突飛な話ではない。
・1つのロックを複数のスレッドが同時にacquireすることは決し
て無い。
・ロックを保持するスレッドがunlockする前に、そのスレッドが
行った変数の更新はすべてメインメモリに書き込まれることが
保証される。synchronized から抜けるごとに、そのスレッド
のキャッシュがメモリに書きもどされると思って良い。
・スレッドがロックを獲得してから変数を読むと、必ずメインメ
モリから読まれる。synchronizedに入るごとにキャッシュが無
効化されると思って良い。
・volatileな変数については、キャッシュせずに毎回メモリから
読み書きされる。
なので今回の話で言えば、
・synchronizedなメソッドinc()に1つのスレッドが入っていると
き、他のスレッドはinc()やget()に入れない。
・スレッドがinc()から抜けたら、そのスレッドが変更したidxの
値はメインメモリに書き込まれる。
・スレッドがinc()やget()に入ったら、メインメモリからidxの
値が読み出される。(だから、前にinc()したスレッドの変更が
ちゃんと伝わる。)
・もしidxをvolatileにしたら、変数が出てくるたびにメインメ
モリへの読み書きが起きる。(だから、synchronizedしないで
も読み書きの結果は他のスレッドにちゃんと伝わる。)
というだけの話。Javaプログラマならみんな理解している通り。
(>>531は477か、あるいは非常に意地の悪い上級者。)
■ このスレッドは過去ログ倉庫に格納されています