在JSR 133烹饪书http://g.oswego.edu/dl/jmm/cookbook.html
在插入障碍的章节中:
- 在每个易失性存储之前发出StoreStore屏障。
- 在所有商店之后但在从具有最终字段的任何类的任何构造函数返回之前发出StoreStore屏障。
- 在每个易失性存储之后发出StoreLoad屏障。
- 在每次易失性加载后发出LoadLoad和LoadStore障碍。
- 在每个MonitorEnter之前或每个MonitorExit之后发出一个ExitEnter屏障。
- 在每个MonitorEnter之后发出EnterLoad和EnterStore障碍。
- 在每个MonitorExit之前发出StoreExit和LoadExit障碍。
- 如果处理器本身不提供间接负载的排序,请在每次加载最终负载之前发出LoadLoad屏障 字段。
但是,在volatile写入之前没有loadstore屏障?因此,在volatile写入后可以重新排序加载?
所以下面的工作没有成功?
Init a = 3
V = false
Thread1
x = a
V = true
Thread2
If (V equal true)
a = -1
其中V是易变的,a是普通的变种。
线程1可以将a读取为x为-1? 这遵循规则之前发生的事情,因为如果Thread2读取V为ture,则x = a发生在a = -1之前?