A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯培军 中级黑马   /  2012-10-26 17:01  /  1176 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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是否为空,判断一次不行么?

评分

参与人数 1黑马币 +15 收起 理由
韩军博 + 15 很给力!

查看全部评分

3 个回复

倒序浏览
双重判断是为了提高效率, synchronized(Single.class)执行这行代码比 执行if(ss==null)更消耗资源执行较慢,这是为了安全性所付出的时间代价。假如A线程已经实例化了对象,那么在进来的线程进行第一次判断 if(ss==null)就不成立,直接拿对象用就行了,不必判断锁了,这样就提高了效率。
回复 使用道具 举报
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对象,与单例模式相违背!
}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

回复 使用道具 举报
一个不行  楼上解释很清楚
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马