jin*_*i70 3 java double-checked-locking
我读过"双重锁定已破损"声明.但我想知道我是否通过函数创建对象,这样可以吗?
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...
}
Run Code Online (Sandbox Code Playgroud)
不,它不会有所作为添加功能不会有任何区别.你的功能无所作为.
但是,如果您声明它将volatile从Java 1.5开始工作
private volatile Helper helper = null;
Run Code Online (Sandbox Code Playgroud)
在Java中进行Lazy初始化的正确方法之一是Initialization-on-demand holder习惯用法 .这依赖于内部类在被引用之前不加载的事实.
class Foo {
private static class HelperHolder {
public static Helper helper = new Helper();
}
public static Helper getHelper() {
return HelperHolder.helper;
}
}
Run Code Online (Sandbox Code Playgroud)