gpt4 book ai didi

多线程环境中的 Java 对象构造

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:35 25 4
gpt4 key购买 nike

我正在读这本名为“Java Concurrency in Practice”的书,作者给出了一个不安全对象发布的例子。这是示例。

public Holder holder;

public void initialize(){
holder = new Holder(42);
}

public class Holder {
private int n;
public Holder(int n) { this.n = n; }
public void assertSanity() {
if (n != n)
throw new AssertionError("This statement is false.");
}
}

那么这是否意味着其他线程甚至可以在对象尚未完全构造时访问该对象?我猜想当线程 A 调用 holder.initialize(); 并且线程 B 调用 holder.assertSanity(); 时,条件 n != n 如果线程 A 尚未执行 this.n = n;

则不会满足

这是否也意味着如果我有一个更简单的代码,比如

int n;

System.out.println(n == n); //false?

最佳答案

如果 assertSanity 方法在 n 的第一次和第二次加载之间被抢占(第一次加载会看到 0,第二次加载会看到构造函数设置的值)。问题是基本操作是:

  1. 为对象分配空间
  2. 调用构造函数
  3. holder设置为新实例

编译器/JVM/CPU 可以重新排序步骤 #2 和 #3,因为没有内存障碍(final、volatile、synchronized 等)

从你的第二个例子来看,不清楚“n”是局部变量还是成员变量,或者另一个线程如何同时改变它。

关于多线程环境中的 Java 对象构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6269147/

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