gpt4 book ai didi

java - 数据竞赛和安全发布

转载 作者:行者123 更新时间:2023-12-03 12:59:24 26 4
gpt4 key购买 nike

@State
@JCStressTest
public class M {
class A {
int f;
A() {
f = 42;
}
}
private A a;

@Actor
void actor1(){
a = new A();
}
@Actor
void actor2(IntResult1 r){
r.r1 = 1;
if(a != null){
r.r1 = a.f;
}
}
}

我用jcstress测试了它,但无法获得输出 0。我知道应该看到该输出并不明显,但是有可能,并且我希望看到它。是否有任何JVM选项(例如 XX:....)来强制执行它?

最佳答案

I know that is is not obvious that I should see that output, but it's possible and I would like to see it.



您的代码确实存在数据争夺是正确的。

(在JMM中规定的规则下,在 f = 42... = a.f之间不可推论的链之间没有发生任何事情。因此,不能保证 a.f始终会看到 42值。)

但是,这场比赛的性质使得它只会在极为罕见的情况下发生。最有可能需要一个具有多个内核的系统,并且在错误的时刻立即执行高内存负载或非自愿线程上下文切换。而且这将取决于JIT编译器1发出的 native 代码。

Is there any JVM option (like XX:....) to enforce it?



不幸的是,没有。

1-请注意,您无法从字节码中得出声音推断。如果JIT编译器不违反JMM规则,则允许JIT编译器(由JLS/JVMS)对包括内存读取和写入的指令进行重新排序。这对于多线程代码的性能很重要。

关于java - 数据竞赛和安全发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46018808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com