引出问题
在某些场景下,可能需要推迟一些高开销的对象初始化操作,即只有在使用该对象时才进行对象初始化操作,类似Spring中的lazy-init(懒加载)。
但是正确实现线程安全的延迟初始化需要一些技巧,否则在一些特殊情况(比如多线程)下很容易出现运行问题。比如,以下初始化代码在多线程下就是非安全的。
public class UnsafeLazyinitialization {
private static Instance instance;
public static Instance getInstance() {
if (instance == null) //A: 线程1执行
instance = new Instance(); //B: 线程2执行
return instance;
}
}
在上面的UnsafeLazyinitialization中,当线程1执行到A处时,线程2正好执行到B处,此时线程A看到的是instance还没有被初始化。
对于UnsafeLazyInitialization,我们可以对getInstance()做同步处理来实现线程安全的延迟初始化。示例代码如下:
public class SafeLazyInitialization {
private static Instance instance