我遇到了一个单例类{延迟初始化}。代码如下
// 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;
}
我的问题是我们通过以下方式获得的好处是什么实例为易失性的因为我们已经通过同步处理了线程安全。
在这种情况下 volatile 有什么好处吗?
这是因为双重检查锁定没有volatile
Java 中不是线程安全的。
制作线程安全的惰性初始化单例的最简单方法是创建类持有者,如下所示:
public class SomeClass {
private static class SomeClassHolder {
public static final SomeClass INSTANCE = new SomeClass();
}
public static SomeClass getInstance() {
return SomeClassHolder.INSTANCE;
}
private SomeClass() {}
}
由于 JVM 行为,这部分代码将加载 SomeClassHolder 并在第一次使用时创建 SomeClass 的实例getInstance()
(而不是当类加载器加载 SomeClass 时)。
您根本不需要使用任何同步!因为 JVM 正在为您做这件事。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)