【发布时间】:2016-04-07 09:42:15
【问题描述】:
根据post,线程安全的单例类应该如下所示。但我想知道是否需要将 volatile 关键字添加到 static CrunchifySingleton instance 变量。由于如果实例被创建并存储在 CPU 缓存中,此时它不会被写回主内存,同时,另一个线程会调用 getInstance() 方法。会不会产生不一致的问题?
public class CrunchifySingleton {
private static CrunchifySingleton instance = null;
protected CrunchifySingleton() {
}
// Lazy Initialization
public static CrunchifySingleton getInstance() {
if (instance == null) {
synchronized (CrunchifySingleton.class) {
if (instance == null) {
instance = new CrunchifySingleton();
}
}
}
return instance;
}
}
【问题讨论】:
-
懒惰初始化的单例是一种浪费;一般来说,单身人士是个坏主意。谷歌已经编写了软件来识别它们,以便从它们的代码中删除。你为什么要使用它们?
标签: java multithreading singleton volatile