黑马程序员技术交流社区

标题: 毕老师视频里的疑问 [打印本页]

作者: 田向向    时间: 2012-7-6 16:53
标题: 毕老师视频里的疑问
本帖最后由 田向向 于 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处也不为空了,为什么连锁都不读了?
请高手解答

作者: 邱泉    时间: 2012-7-6 20:17
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-8-14 07:39
111111111111111111111111111




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