我从mailing list邮件它说,如果挥发性瓦尔行动包含数据争再保证(“A计划是否能正确同步,当且仅当所有顺序一致的执行都是免费的数据竞争。”在JLS)不能应用。为什么我们不能应用JLS中包含的保证?
为了方便,我只是把的orginal content部分在这里:
我有一个使用volatile变量的程序,我试图来思考它使用“A计划是否能正确同步,当且仅当所有顺序一致的执行都没有数据竞争。“在JLS3中保证。
JLS3似乎包含毛刺,防止我从证明我的计划是免费的数据竞争。具体来说,考虑在同步顺序中R之后的易失性变量V的读取R和V的写入W。 JLS3似乎认为R和W是相冲突的访问。而且, 从R到W之前没有发生 - 之前的边缘(以及如此)。因此,JLS3似乎也认为R和W构成了数据竞赛。最后,似乎因此我不能适用上述保证。
所以这是我的问题:如果对易失性变量的操作包含数据竞争,为什么我们不能应用JLS中包含的保证?
这不是一个保证,这是一个定义,并明确排除了你所描述的情况。不是一个真正的问题。 – EJP
的答案给出为[在该消息(http://www.cs.umd.edu/~pugh/java/memoryModel/archive/2482.html)=>有在数据竞争的定义中的错误,其允许这样做,但它不应该是这种情况(即使用volatile变量应该可以防止数据竞争,但现在的JMM措辞并不总是这种情况)。 – assylias
@assylias令人困惑的是,这一事实已为OP所熟知。 –