[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 1633] Re: volatile のはなし Re: Java スレッドプログラ ミングを読む会第 6 回の議事録
高橋(徹)です。
"TAKEKAWA Tsutomu <takekawa@xxxxxxxxxxxxxx>"さんは書きました:
> これを読むと、定義されているのは、単一のスレッド時の動作順序
> であって、複数スレッドの場合ではないので、複数スレッドの場合に
> 同期を取りたい場合はsynchronizedを使うのが吉ということになるので
> しょうか?
JLS(Java Language Specification)を読むと、異なるスレッドがアクセス
する場合については規定していないようですね。
同じスレッドにおいて、volatile宣言された変数へのアクセスは必ず
メインメモリへ反映されるのですが、別スレッドがアクセスするときは
排他されるわけではないので、下記のようなタイミングが発生するのでは
ないでしょうか?
スレッドT1 変数V スレッドT2
|代入 | |
*1 +−−−→+読み込み|
|ストア +←−−−+ *2
+−−−→+ ロード|
|書き込み+←−−−+
+−−−→+ 使用|
| +←−−−+
*1で変数へ代入が行われる
*2で変数の値を参照する
順序としては*1が先なので、本来は*1で代入した値を*2で参照したいのだが
メモリオペレーションは上記図のようになった場合、*2で参照できるのは
まだ*1の代入が反映される前の値となってしまう。
(変数Vは、実際には作業メモリ上の作業コピーおよびメインメモリ上の
マスターコピーから成ります)
---
Toru TAKAHASHI <torutk@xxxxxxxxxxx>
http://www.alles.or.jp/~torutk/oojava/