单例模式中有一种实现方式叫双重检查锁,主要是为了更好、更安全的实现单例功能。先来看一下该方法的核心代码:
public class DoubleCheckedLocking{
private static Instance instance;
public static Instance getInstance(){
if(instance ==null){
synchronized (DoubleCheckedLocking.class){
if(instance ==null)
instance=new Instance(); //①
}
}
return instance;
}
}
表面上来看,在执行该代码时,先判断instance对象是否为空,为空时再进行初始化对象。即使是在多线程环境下,因为使用了synchronized锁进行代码同步,该方法也仅仅创建一个实例对象。但是,从根本上来说,这样写还是存在一定问题的。
问题源头: