我从邮件列表中收到一封邮件,其中说如果对 volatile vars 的操作包含数据竞争,那么保证(“当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。”在JLS中)不能应用。
为方便起见,我只是将部分原始内容放在这里:
我有一个使用 volatile 变量的程序,我试图使用“当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步”来推断它。JLS3 中的保证。
JLS3 似乎包含一个故障,使我无法证明我的程序没有数据竞争。具体来说,考虑对 volatile 变量 V 的读取 R 和在同步顺序中 R 之后的 V 的写入 W。JLS3 似乎认为 R 和 W 是冲突的访问。此外,从 R 到 W 没有发生之前的边缘(这是正确的)。因此,JLS3 似乎也认为 R 和 W 构成了数据竞赛。最后,因此我似乎无法应用上述保证。
所以这是我的问题:如果对 volatile vars 的操作包含数据竞争,为什么我们不能应用 JLS 中包含的保证?