java - 构造函数的结尾恰好 - 在 Java 中的关系之前

标签 java multithreading

在 Java 中,构造函数的结束不是发生在关系之前,我的理解是否正确?下面的线程 A 和 B 未同步的代码是否可能以某种方式抛出 NullPointerException?

// Shared reference declaration
public MyClass val;

// Class declaration
public class MyClass {
    public Object object;
    public MyClass() {
        object = new Object();
    }
}

// Using in thread A
MyClass loc = new MyClass();
val = loc;

// Using in thread B
if(val != null) {
    val.object.hashCode(); // IMO could throw NPE
}

最佳答案

如果是

 val.object.hashCode();

那么就有可能出现 NPE,因为虽然线程 B 可能看到 val = loc 但由于缓存,它可能还没有看到 object = new Object();出于性能原因,Java 的弱内存模型允许在不同内核等上的行为。

我认为您的原始代码不会抛出 NPE,因为如果 val 不为空,则 hashCode 将执行。

if(val != null) {
    val.hashCode(); // IMO could throw NPE
}

关于java - 构造函数的结尾恰好 - 在 Java 中的关系之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24116468/

相关文章:

Java - 因内存不足错误而关闭

java - kotlin dagger改造现场注入(inject)

java - 有没有办法让 Nimbus Look&Feel 为顶级 JFrame 呈现自己的窗口装饰?

java - Java Spring 中受控的 ThreadPoolExecutor

ruby - 单线程还处理并发请求?

java - 将 html 标签添加到 ListView 行文本

java - 如何在java中实现黑名单

java - J2me多线程http数据从另一个线程泄漏

android - 线程仅在 Android 的 Release模式下卡住 UI

java - Jacorb 挂起以响应远程 API 调用