黑马程序员技术交流社区

标题: 关于多线程中懒汉设计模式的小疑惑 [打印本页]

作者: 冯培军    时间: 2012-10-26 17:01
标题: 关于多线程中懒汉设计模式的小疑惑
class Single
{
    private static Single ss =null;
    private Single(){}
    public static Single getInstance()
{
    if(ss==null)
{
    synchronized(Single.class)
{
    if(ss==null)
    ss = new Single();
}
}
    return ss ;
}
}

不明白为什么这里需要判断两次ss是否为空,判断一次不行么?

作者: 鲁中需    时间: 2012-10-26 17:26
双重判断是为了提高效率, synchronized(Single.class)执行这行代码比 执行if(ss==null)更消耗资源执行较慢,这是为了安全性所付出的时间代价。假如A线程已经实例化了对象,那么在进来的线程进行第一次判断 if(ss==null)就不成立,直接拿对象用就行了,不必判断锁了,这样就提高了效率。
作者: 张忠豹    时间: 2012-10-26 17:29
if(ss==null)   A线程与B线程都进来了,而且这个时候ss为null,这两个线程都满足
{      A进入,B等着
    synchronized(Single.class)
{     //A线程
    //if(ss==null)    如果没有这句,就应该在A线程中直接创建一个对象给ss,此时ss是有值的,而B线程却不知道
    ss = new Single();
}
//A线程出来了,B线程就从synchronized那一块进入,进来了直接就造了一个Single对象,然后赋值给ss,这个时候内存中有两个Single对象,与单例模式相违背!
}
作者: 齐连涛    时间: 2012-10-26 18:01
一个不行  楼上解释很清楚




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2