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保证线程安全,外层判空保证效率。