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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田向向 高级黑马   /  2012-7-6 16:53  /  2615 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田向向 于 2012-7-6 20:20 编辑

看毕老师视频第6天最后一个视频的时候有点小疑问,特此请教各位:

class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
  if(s==null)                         //1
  {
   synchronized(Single.class)
   {   
    if(s==null)         //2
     -->A
     s = new Single();
   }
  }
  return s;
}
}
疑问1:A初始化出去之后,B再进来,为什么在2处判断不为空?
疑问2:C再进来,为什么1处也不为空了,为什么连锁都不读了?
请高手解答

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 多线程问题,大家应该要多加理解!.

查看全部评分

2 个回复

倒序浏览
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
  if(s==null)                         //1
  {
   synchronized(Single.class)  //2
   {   
    if(s==null)         //3
     -->A               //4
     s = new Single();
   }
  }
  return s;
}
}

1.A线程先访问,在4处挂起,访问未结束,此时s=null。
2.同时B线程访问,1处判断为真,进入2处被锁住(因为此时A线程还未结束访问)。
3.B线程挂起,A线程继续执行, s = new Single(),s!=null,A线程结束访问。
4.B线程继续执行,3处判断为假,跳过if语句继续往下执行,直到结束。
5.C线程访问,1处判断为假(此时s!=null),不执行synchronized(Single.class),跳过if判断继续执行直到结束。

总结:当A线程创建了Single对象后,以后1处判断都为假,所以都不会执行synchronized(Single.class),所以提高了程序的效率。

点评

是版主,哈哈,,说错了  发表于 2012-7-6 20:20
明白了,谢谢,希望楼主能给你点奖励  发表于 2012-7-6 20:20

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 回答的不错!

查看全部评分

回复 使用道具 举报
111111111111111111111111111
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马