Java 为什么我们不能应用JLS中包含的担保?
我收到一封邮件,上面说,如果volatile vars上的操作包含数据竞争,那么保证(“当且仅当所有顺序一致的执行都没有数据竞争时,程序才正确同步。”in)不能应用 为了方便起见,我只在这里放了一部分: 我有一个使用可变变量的程序,我试图用“当且仅当所有顺序一致的执行都没有数据争用时,程序才正确同步”来解释它 JLS3似乎包含一个小故障,使我无法证明我的程序没有数据竞争。具体地,考虑易失性变量V的读R和在同步顺序中的R之后的V的写入W。JLS3似乎认为R和W是相互冲突的访问。此外 在从R到W的边之前没有发生(这是正确的)。因此,JLS3似乎也考虑R和W来构成数据竞争。最后,因此,我似乎无法申请上述担保Java 为什么我们不能应用JLS中包含的担保?,java,memory-model,Java,Memory Model,我收到一封邮件,上面说,如果volatile vars上的操作包含数据竞争,那么保证(“当且仅当所有顺序一致的执行都没有数据竞争时,程序才正确同步。”in)不能应用 为了方便起见,我只在这里放了一部分: 我有一个使用可变变量的程序,我试图用“当且仅当所有顺序一致的执行都没有数据争用时,程序才正确同步”来解释它 JLS3似乎包含一个小故障,使我无法证明我的程序没有数据竞争。具体地,考虑易失性变量V的读R和在同步顺序中的R之后的V的写入W。JLS3似乎认为R和W是相互冲突的访问。此外 在从R到W的边
因此,这就是我的问题:如果volatile vars上的操作包含数据竞争,为什么我们不能应用JLS中包含的保证?顺序一致的执行在对volatile vars的写入之前包含volatile的读取 => 执行包含数据竞争 => 程序未“正确同步” =>
JLS不提供适用于正确同步程序的保证。这不是保证,而是定义,它明确排除了您描述的条件。这不是一个真正的问题。答案是=>数据竞争的定义中存在一个漏洞,允许这样做,但事实并非如此(即使用易失性变量可以防止数据竞争,但在当前的JMM措辞中并不总是如此)。@assylias令人困惑,这一事实已经为OP所熟知。@MarkoTopolnik然后我不明白为什么他会问他是否已经知道答案(除非他需要你提供的证据)。@assylias我能找到的最好的答案是,有“更大的问题”需要处理,所以没有人会为了纠正这个“小”错误而费心去触碰规范。当然,无论何时你碰任何东西,你都有引入新问题的风险,因此没有人会仓促介入。顺便说一句,它不仅在7版发布之前就被发现了,而且在te第三版发布时基本上就被发现了。Marko Topolnik,谢谢你的回答。我不知道我的理解是否正确,如果不正确,请纠正它:因为“一个只在线程之间共享volatile vars的程序不可能包含数据竞争”,“一个顺序一致的执行(这样的程序)在写入volatile之前包含volatile的读取”仍然是正确同步程序的执行,但根据当前的数据竞争定义,“执行包含数据竞争”,因此“程序未‘正确同步’”。因为根据上述保证和当前的数据竞争定义,我们可以得出相反的结论,“因此,我似乎无法申请上述担保。“这并不矛盾,而是精神和文字之间的冲突:这封信说共享volatile vars的程序没有正确同步;这种精神让我们很明显,它是正确同步的。冲突也是一种矛盾,对吗?谢谢你的回复。为了解决这个问题,我还有一个建议,但我不知道是否可行:在“发生在关系之前”的定义中添加一个新项:如果x和y是同步动作,并且x按同步顺序排在y之前,那么hb(x,y)。那么你对此有何看法?不,我使用“冲突”的方式与逻辑术语“矛盾”无关。这就好像你有一个完全一致的正式数字系统,其中1+1=3。冲突只存在于系统和它应该模拟的世界部分之间,但失败了。