[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/