单例模式为啥要进行双重判空?

599 阅读1分钟
public class SingletonClass{
    private static SingletonClass instance=null;
    public static SingletonClass getInstance(){
        if(instance==null){
            synchronized(SingletonClass.class){
                if(instance==null){
                    instance=new SingletonClass();
                }
            }
        }
        return instance;
    }
    private SingletonClass(){}
}

原理:
当两个线程同时调用这个方法的时候,如果一个判空可能会创建两个对象,比如当A线程还没创建完对象的时候,B线程也能进入if分支里面,所以使用synchronized加锁排队;如果每次都排队的话,效率就低下了,所以需要外层的判空。
总结:synchronized保证线程安全,外层判空保证效率。