我看过The "Double-Checked Locking is Broken" Declaration。但是我想知道我是否通过函数创建了对象,这样可以吗?
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null)
helper = createHelper();
}
return helper;
}
private Helper createHelper() {
return new Helper();
}
// other functions and members...
}
答案 0 :(得分:5)
不,它不会有所作为添加功能不会有任何区别。你的功能什么也没做。
但是,如果您将其声明为volatile
,它将从Java 1.5开始工作
private volatile Helper helper = null;
java中Lazy初始化的正确方法之一是Initialization-on-demand holder idiom 。这依赖于内部类在被引用之前不会被加载的事实。
class Foo {
private static class HelperHolder {
public static Helper helper = new Helper();
}
public static Helper getHelper() {
return HelperHolder.helper;
}
}