gpt4 book ai didi

java - 演示不正确发布的对象的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:42 24 4
gpt4 key购买 nike

JCIP 警告我们不要发布不正确的对象(参见 here)。如果一个对象是可变的,JVM 可能会决定在其初始化完成之前发布该对象。

所以代码

class Holder {public int h = 0;public Holder(int _h) {h = _h;}}
a = new Holder(10);

可以变得有效

a = new Holder();
// inlined constructor
a.h = 10;

然后当不同的线程访问a.h时,假设它永远不会为0,它可能会失败

// Thread #1 executing
a = new Holder();
// Thread #2 preempts
if (a != null) System.out.println("result: "+(100/a.h)); // oops...

我试图证明这个问题。但是我写的代码没有证明这一点。我做的是一个holder

static class Holder {
int h = 0;
int dummy = 0;
public Holder(int h) {
// if construction takes time, maybe I have better chance creating the bug...
for (long i=0;i<1000*1000;i++) {
dummy += i*(-1+(i%2*2));
}
this.h = h;
}
public int verifyNonZero() {
return 1/h;
}
}

然后我运行 1000 个线程将 new Holder() 发布到静态 holder 变量,另外 1000 个线程运行 holder.verifyNonZero() .参见 full gist .

即使使用 -server,它对 Java 1.6 也没有真正帮助。

最佳答案

不能保证安全的事实并不意味着您的环境中一定会出现问题。

据我所知,没有证据表明可以在现代 JVM 上演示这种行为。但是,有证据表明一些较旧的 JVM 受到了影响:

另请注意,乱序执行不仅可能由 JVM 引起,也可能由 CPU 引起。然而,x86 CPU 的内存模型非常保守(Who ordered memory fences on an x86?),因此这种行为也不会由常用的 CPU 引起。

因此,我认为您不太可能能够在典型的现代环境中演示此问题。

关于java - 演示不正确发布的对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579865/

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