这是双重检查单身人士的正确使用吗?
Is this a correct use of double checked singleton?
我基本上是在为 HelperWrapper 的用户寻找一种缓存机制。
这是对双重检查单例的正确使用吗?
final class HelperWrapper {
private static volatile Helper helper = null;
public static Helper getHelper() {
if (helper == null) {
synchronized (HelperWrapper.class) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
}
我知道这不会阻止某人实例化他们自己的 Helper 对象,但这不是目标。
附加信息:
- 我无法修改 Helper class 来使构造函数成为私有的。我也不想。
- 要求规定不应急切实例化助手
截至 Java 5,该实施 is safe。但是,请考虑改用内部 class:
final class HelperWrapper {
private static final class DeferredLoader {
public static final Helper HELPER_INSTANCE = new Helper();
}
public static Helper getHelper() {
return DeferredLoader.HELPER_INSTANCE;
}
}
这两者都提供线程安全和惰性初始化,同时利用 class 初始化的线程安全保证来避免每次调用时使用 volatile 或同步关键字。
我基本上是在为 HelperWrapper 的用户寻找一种缓存机制。 这是对双重检查单例的正确使用吗?
final class HelperWrapper {
private static volatile Helper helper = null;
public static Helper getHelper() {
if (helper == null) {
synchronized (HelperWrapper.class) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
}
我知道这不会阻止某人实例化他们自己的 Helper 对象,但这不是目标。
附加信息:
- 我无法修改 Helper class 来使构造函数成为私有的。我也不想。
- 要求规定不应急切实例化助手
截至 Java 5,该实施 is safe。但是,请考虑改用内部 class:
final class HelperWrapper {
private static final class DeferredLoader {
public static final Helper HELPER_INSTANCE = new Helper();
}
public static Helper getHelper() {
return DeferredLoader.HELPER_INSTANCE;
}
}
这两者都提供线程安全和惰性初始化,同时利用 class 初始化的线程安全保证来避免每次调用时使用 volatile 或同步关键字。