双重检查锁定模式(也被称为"双重检查加锁优化","锁暗示"(Lock hint)) 是一种软件设计模式用来减少并发系统中竞争和同步的开销。有时候会在单例模式里遇到这个双重检查锁定,这个技术是单例模式的一种具体的实现,通过它来进行单例模式里的延迟初始化,保证在经过延迟初始化之后还是只有一个单例类的实例被创建。
java程序中可能需要推迟一些高开销的对象初始化操作,只有在使用这些对象时才进行初始化,所以有时候采用延迟初始化来降低初始化类和创建对象的开销,而双重检查锁定是常见的延迟初始化技术(本文主要介绍该技术但是不推荐使用它,后面会进行分析)。
以下是非线程安全的延迟初始化案例:
public class UnsafeLazyInitialization {
private static Instance instance ;
public static Instance getInstace(){
if(instance == null) //1.A线程执行
instance =new Instance(); //2.B线程执行
return instance;
}
}
至于为什么是线程不安全,在线程A执行代码1的时候线程B执行代码2,线程A可以看见instance引用的对象还没有完成初始化。可以对getInstance方法做同步处理来实现线程安全的延迟初始化(加关键字synchronized),但是处理之后如果被频繁调用就会导致执行性能下降。如果不会被频繁使用就会提供一个较好的性能。
但