gpt4 book ai didi

java - 了解初始化安全性

转载 作者:行者123 更新时间:2023-12-02 06:15:39 25 4
gpt4 key购买 nike

B. Goetz 在他的 JCIP 第 16.3 章中写道:

Initialization safety means that SafeStates in Listing 16.8 could be safely published even through unsafe lazy initialization or stashing a reference to a SafeStates in a public static field with no synchroniation [...]

代码:

@ThreadSafe
public class SafeStates {
private final Map<String, String> states;

public SafeStates(){
states = new HashMap<String, String>();
states.put("alaska", "AK");
states.put("alabama", "AL");
...
states.put("wyoming", "WY");
}

public String getAbbreviation(String s){
return states.fet(s);
}
}

不安全的延迟初始化

@NotThreadSafe
public class UnsafeLazyInitialization{
private static Resource resource;

public static Resource getInstance(){
if(resource == null)
resource = new Resource();
return resource;
}
}

我不明白为什么以这种方式发布对象是安全的。 resource 引用不是 volatile ,因此在写入它之间不存在happens-before (resource = new Resource()) code> )以及随后的读取,即使 Resource 是不可变的。

这样,任何未初始化资源的线程都可能观察到资源陈旧值

最佳答案

UnsafeLazyInitialization 是不安全的,因为一个线程可能会在 Resource 的构造函数完全完成之前设置 resource 的值,因此另一个线程将选择对部分初始化的对象的引用.

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

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