[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1635] Re: volatile のはなし Re: Java スレッドプログラ ミングを読む会第 6 回の議事録



こんにちは、澤田です。

# 最近ちょっと忙しくて積読メンテも停止中・・本は読んでるけど(^^;
# でも volatile の話は非常に勉強になるので参加させてください。

On Tue, 8 May 2001 01:29:38 +0900
in [jfriends-ml 1633] Re: volatile のはなし Re: Java スレッドプログラミングを読む会第 6  回
の議事録
Toru TAKAHASHI <torutk@xxxxxxxxxxx> wrote:

> 高橋(徹)です。

> JLS(Java Language Specification)を読むと、異なるスレッドがアクセス
> する場合については規定していないようですね。
> 同じスレッドにおいて、volatile宣言された変数へのアクセスは必ず
> メインメモリへ反映されるのですが、別スレッドがアクセスするときは
> 排他されるわけではないので、下記のようなタイミングが発生するのでは
> ないでしょうか? 
> 
> スレッドT1 変数V スレッドT2
>   |代入  |    |
> *1 +−−−→+読み込み|
>   |ストア +←−−−+ *2
>   +−−−→+ ロード|
>   |書き込み+←−−−+
>   +−−−→+  使用|
>   |    +←−−−+

JLS 17章に読みふけりながら考えてみたのですが、上記例のようなきわどい
タイミングでなくても、「そもそも volatile はロックとは違うので、
ストアしたらすぐに書き込みが行われるとは限らない」
のではないでしょうか?そうするとT2はなかなか新しい値を取得できない
ということになります。間違っていますか?
"Javaスレッドプログラミング" 3.2.6.5 の SpinLock のコードの場合、
T1に相当するスレッドは release() を呼ぶだけかもしれません。
もし synchronized でなければ、書き込みをいつするかは実装依存に
なってしまう。「メモリー同期がロックを解放したときに発生することを
保証するために、synchronizedを指定」という説明があるのはそのためかなと・・
release()を呼んだT1がその後なにか一つでも変数にアクセスすれば
(volatileの制約によって)書き込みが行われるのですけど。


> *1で変数へ代入が行われる
> *2で変数の値を参照する
> 順序としては*1が先なので、本来は*1で代入した値を*2で参照したいのだが
> メモリオペレーションは上記図のようになった場合、*2で参照できるのは
> まだ*1の代入が反映される前の値となってしまう。

「書くスレッドは一つだけ、あとのスレッドは読むだけ」ということであれば
これは問題ないですよね?ロックしたところでタイミングがずれるだけなので。

___
澤田 大輔(die)
email: die@xxxxxxxx(home), swd@xxxxxxxxxxxxxxxx(office)