sor*_*nki 2 java design-patterns
我遇到了一个单例类{lazy initialization}.代码如下
// Singleton reference for this class
private static volatile FileProperties INSTANCE = null;
public static FileProperties getInstance() {
if (INSTANCE == null) {
synchronized (FileProperties.class) {
if (INSTANCE == null) {
INSTANCE = new FileProperties();
}
}
}
return INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我们通过使INSTANCE变得不稳定而获得的好处 因为我们已经通过synchronized来处理线程安全问题.在这种情况下,volatile是否有任何好处?
这是因为双重检查锁定volatile在Java中不是线程安全的.
制作线程安全的lazy-init单例的最简单方法是创建类持有者,如下所示:
public class SomeClass {
private static class SomeClassHolder {
public static final SomeClass INSTANCE = new SomeClass();
}
public static SomeClass getInstance() {
return SomeClassHolder.INSTANCE;
}
private SomeClass() {}
}
Run Code Online (Sandbox Code Playgroud)
由于JVM行为的那部分代码将加载SomeClassHolder并在第一次使用时创建SomeClass的实例getInstance()(而不是在类加载器加载SomeClass时).
您根本不需要使用任何同步!因为JVM正在为你做这件事.