单件模式的双重检查加锁有点不明白

来源:百度知道 编辑:UC知道 时间:2024/06/21 06:13:41
请看代码
public class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance==null)
{
synchronized(Singleton.class){
if(uniqueInstance==null){
uniqueInstance=new Singleton();
}
}
}
return uniqueInstance;
}
//其他方法
}
为什么要判断两次uniqueInstance==null,不是在第一此判断后给Singleton加上了锁吗,我人为没有必要判断两次,判断两次是为了避免什么情况???

外面的检查就是本来要进行的检查,不说了。里面的检查是这样的,如果两个线程都判断到uniqueInstance是null,都进入了外面的if,那么他们将执行两次new,这样就不对了。
其实本来的代码是在方法的申明处就加上synchronized的,但是由于同步降低了性能,于是才有了这样的策略,即只在第一次创建的时候才保证同步,而大部分时候是不会进入synchronized块的~~