2012-08-24 40 views
1

我从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中包含的保证?

+0

这不是一个保证,这是一个定义,并明确排除了你所描述的情况。不是一个真正的问题。 – EJP

+1

的答案给出为[在该消息(http://www.cs.umd.edu/~pugh/java/memoryModel/archive/2482.html)=>有在数据竞争的定义中的错误,其允许这样做,但它不应该是这种情况(即使用volatile变量应该可以防止数据竞争,但现在的JMM措辞并不总是这种情况)。 – assylias

+0

@assylias令人困惑的是,这一事实已为OP所熟知。 –

回答

2

甲顺序一致的执行包含易失性的写入前于挥发性

=>

执行读取包含数据种族

=>

程序不“正确同步“

=>

JLS不提供适用于正确同步程序的保证。

+0

Marko Topolnik,谢谢你的回答。我不知道我的理解是否正确,如果不正确,请更正它: 因为“只在线程之间共享volatile变量的程序不可能包含数据竞争”,“程序)包含对易失性写入之前的易失性读取“仍然是正确同步程序的执行,但根据数据竞争的当前定义,”执行包含数据竞争“,所以”程序不是“正确同步“”。 – newman

+0

由于根据上述保证和数据竞争的当前定义,我们可以得出一个相反的结论,“似乎我不能应用上述保证。” – newman

+0

不存在任何矛盾,但**精神**和**信件**之间的冲突:*信*说共享挥发性变量的程序**不正确同步**; *精神*显而易见,它**正确同步**。 –

相关问题