Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们不能应用JLS中包含的担保?_Java_Memory Model - Fatal编程技术网

Java 为什么我们不能应用JLS中包含的担保?

Java 为什么我们不能应用JLS中包含的担保?,java,memory-model,Java,Memory Model,我收到一封邮件,上面说,如果volatile vars上的操作包含数据竞争,那么保证(“当且仅当所有顺序一致的执行都没有数据竞争时,程序才正确同步。”in)不能应用 为了方便起见,我只在这里放了一部分: 我有一个使用可变变量的程序,我试图用“当且仅当所有顺序一致的执行都没有数据争用时,程序才正确同步”来解释它 JLS3似乎包含一个小故障,使我无法证明我的程序没有数据竞争。具体地,考虑易失性变量V的读R和在同步顺序中的R之后的V的写入W。JLS3似乎认为R和W是相互冲突的访问。此外 在从R到W的边

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

为了方便起见,我只在这里放了一部分:

我有一个使用可变变量的程序,我试图用“当且仅当所有顺序一致的执行都没有数据争用时,程序才正确同步”来解释它

JLS3似乎包含一个小故障,使我无法证明我的程序没有数据竞争。具体地,考虑易失性变量V的读R和在同步顺序中的R之后的V的写入W。JLS3似乎认为R和W是相互冲突的访问。此外 在从R到W的边之前没有发生(这是正确的)。因此,JLS3似乎也考虑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。冲突只存在于系统和它应该模拟的世界部分之间,但失败了。