在这里[http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5][1]
上面写着:
给定写w,冻结f,动作a(不是最终字段的读取),被f冻结的最终字段的读r1,以及使hb(w,f),hb(f,a),mc(a,r1)和反式(r1,r2)的读r2,然后在确定r2可以看到哪些值时,我们考虑hb(w,r2)。(这种情况发生-在排序之前不会与其他发生的情况传递关闭-在订货之前。)
他们在这里想说什么?我知道r2只是读取r1读取的最后一个字段值,所以很明显,hb(w,r2),因为r1读取了这个变量的正确版本,因为这个值被f冻结了。很深吗?另外,他们想要说的是,这个hb命令不会与其他hb订单“过渡关闭”?
发布于 2014-08-31 07:44:34
r1读取由w编写的值的唯一事实并不意味着hb(w, r1),更不用说hb(w, r2)了。情况正好相反:如果在w和r1之间发生关系之前就发生了,那么JMM保证将观察到什么值;否则就没有保证。如果r1确实观察到了来自w的值,那只是一个巧合,并不是在特殊情况下导致关系发生之前发生的。
最好的方式来想象一个尖锐的例子,这一点很重要,是通过数据竞争安全发布的用例。对String的引用写入非易失性字段,而不进行同步,然后将该字段从另一个线程中取消引用。如果线程碰巧观察到String (不能保证它会),则可以保证线程将看到String处于一致状态。
如果没有额外发生的特殊规定--在此之前,只有在你方报价所描述的确切情况下才会考虑,则不能保证String将被完整地遵守。
他们想说的是,这个hb订单不会与其他hb订单“临时关闭”吗?
通常情况下,hb(a,b)和hb(b,c)意味着hb(a,c),但是这种传递性并不适用于特殊的发生--在因场结冰而存在之前。这些特殊的发生-以前有他们自己的“命名空间”。
https://stackoverflow.com/questions/25589821
复制相似问题