延迟初始化在java中应用非常多,最常见的就是单例模式。但是可能大部分时候写的并不完全正确,先将正确写法记录在此。
//延迟初始化
class Foo {
//延迟初始化的对象要标记为volatile, 这样保证对其他线程的可见性
private volatile Helper helper = null;
//延迟初始化需要双重检查,并加同步语句块
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null)
helper = new Helper();
}
}
return helper;
}
}
参考资料: