1

我从邮件列表中收到一封邮件,其中说如果对 volatile vars 的操作包含数据竞争,那么保证(“当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。”在JLS中)不能应用。

为方便起见,我只是将部分原始内容放在这里:

我有一个使用 volatile 变量的程序,我试图使用“当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步”来推断它。JLS3 中的保证。

JLS3 似乎包含一个故障,使我无法证明我的程序没有数据竞争。具体来说,考虑对 volatile 变量 V 的读取 R 和在同步顺序中 R 之后的 V 的写入 W。JLS3 似乎认为 R 和 W 是冲突的访问。此外,从 R 到 W 没有发生之前的边缘(这是正确的)。因此,JLS3 似乎也认为 R 和 W 构成了数据竞赛。最后,因此我似乎无法应用上述保证。

所以这是我的问题:如果对 volatile vars 的操作包含数据竞争,为什么我们不能应用 JLS 中包含的保证?

4

1 回答 1

2

顺序一致的执行包含在写入 volatile 之前读取 volatile

=>

执行包含数据竞争

=>

程序未“正确同步”

=>

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

于 2012-08-24T10:29:53.663 回答