当一个类有自己的静态实例时,我无法理解初始化顺序.此外,为什么这种行为似乎有所不同String.
请参阅以下示例:
public class StaticCheck {
private static StaticCheck INSTANCE = new StaticCheck();
private static final List<String> list =
new ArrayList<String>(Arrays.asList("hello"));
private static final Map<String, String> map =
new HashMap<String, String>();
private static final String name = "hello";
public static StaticCheck getInstance() {
return INSTANCE;
}
private StaticCheck() {
load();
}
private void load() {
if(list != null) {
System.out.println("list is nonnull");
} else {
System.out.println("List is null");
}
if(name != null) {
System.out.println("name is nonnull");
} else …Run Code Online (Sandbox Code Playgroud) private static final Map<String, SampleClass> map = new
ConcurrentHashMap<>();
public static SampleClass getsampleclass(String context) {
if( map.get(context) != null) {
return map.get(context);
} else {
SampleClass cls = new SampleClass(context);
map.put(context, cls);
}
}
Run Code Online (Sandbox Code Playgroud)
在多线程环境中,如果两个线程获取map.get(context)为null,则两个线程都将创建cls,并且put将被阻塞,因此thread1将首先放置,之后thread2将覆盖放置的内容thread1.
这种行为是否正确?
在我的情况下,我想在map.get完成后返回相同的值,因此我看到使用HashMap和同步它是首选.