1.通常懒加载初始化的典型实现方式:
public class LazyInit {
public static Resource resource;
public static Resource getResource() {
if (resource == null) {
resource = new Resource();
}
return resource;
}
}
在单线程应用程序中,以上示例保证按预期工作。但在多线程应用程序可能有各种不同的结果。它可以按预期工作,它也可能多次初始化资源,它也可能发布部分对象(读取部分对象), 所以为不安全实现方式。
2. 安全的实现方式
public class LazyInit {
public static Resource resource;
public synchronized static Resource getResource() {
if (resource == null) {
resource = new Resource();
}
return resource;
}
}
现在,resource由LazyInit类保护。只有一个线程可以进入此方法并检查resource是否已初始化,如果是,则返回当前实例。
3. 在某些情况下,您可能为了加快访问Resource实例的过程采取双重检查
public class LazyInit {
publ