gpt4 book ai didi

java - 空引用的安全初始化

转载 作者:行者123 更新时间:2023-11-30 10:11:22 25 4
gpt4 key购买 nike

我想知道初始化为 null 的非最终字段存在哪些发布保证(如果有的话)。

考虑以下片段:

public class MyClass {

private final CopyOnWriteArrayList<Inner> list = new CopyOnWriteArrayList<>();

//called by thread 1
public void init() {
// initialise Inner instance
list.add(new Inner());
}

//called by thread 2
public void doSomething() {
for (Inner i : list) {
// access non-final field
Object ref = i.ref;
// do something
// ...
// ...

// potentially set i.ref
}
}

private static class Inner {
// initialised by thread 1
Object ref = null;
}
}

假设 doSomething() 总是被线程 2 调用,这安全吗?线程 2 在第一次访问时会看到什么保证?线程 2 是否有可能看到非 null 的内容?

在 JMM 的什么地方描述了这种情况的语义?

最佳答案

JVM 将保证您不会看到无中生有的值,因此除了null 之外的任何值都是不可能的,以防 List 不为空(当然在本例中)。如果涉及一个不同的线程(假设 Thread3)会改变您的列表(向其添加元素),则 Thread2 可以看到这些更新。请注意,CopyOnWriteArrayList 的各个方法是线程安全的;你的方法 doSomething 不是

参见 JLS对于细节或优秀(而且相当复杂,可能只适合我)Aleksey article .

关于java - 空引用的安全初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52496473/

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