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

[复制链接]
查看11 | 回复2 | 2009-3-12 20:05: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加上了锁吗,我人为没有必要判断两次,判断两次是为了避免什么情况???

回复

使用道具 举报

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

使用道具 举报

千问 | 2009-3-12 20:05:41 | 显示全部楼层
假设有2个线程同时执行到判断 uniqueInstance是否为空, 这时候两个线程都得到为空的结果,然后呢此时a线程得到锁(另外一个线程在等锁) 然后它就创建了实例,后面释放锁。 这时另外 一个线程b拿到a释放的锁之后也进来了,如果它也new的话 这样就变成创建2个对象了,所以需要在锁里面再加一层判断!...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行