黑马程序员技术交流社区

标题: 双重判断为什么能增加代码的运行效率? [打印本页]

作者: 吴通    时间: 2012-8-24 20:28
标题: 双重判断为什么能增加代码的运行效率?
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
  if(s==null)
  {
   synchronized(Single.class)
   {
    if(s==null)
    s=new Single();
   }
  }
  return s;
}
}
class SingleDemo
{
public static void main(String[] args)
{
  Single s1=Single.getInstance();
}
}

双重判断为什么能增加代码的运行效率?
虽然减少了锁的判断,但是也增加了if的判断啊

作者: 刘芮铭    时间: 2012-8-24 20:34
很简单,你可以这样理解!

第一次:第一次判断s是否为null,是的话就进来同步代码块!不是的话进不去啦!

第二次:判断s是否为null,是的话就新建一个对象!

第三次:再判断s是否为null,因为上一步已经建立一个对象,所以不为null,所以来第一步都进不去!

综上所述:双重判断效率高

作者: 杨鹏鹏    时间: 2012-8-24 20:45
比如说,A线程进来
  if(s==null)
       A(停在这儿)
    s=new Single();
   }
B线程进来了。到对象锁哪儿进不来,A醒来,初始化,B判断第二个 if(s==null),b不再初始化,C线程进来判断第一个 if(s==null),以后进来的线程都不满足第一个 if(s==null),都不再判断锁,所以增加代码的运行效率

作者: 吴通    时间: 2012-8-24 20:51
虽然少了判断锁,但是在判断锁之前不是还得判断s是否为null,这样不是相当于少了一个判断又加了一个判断?
作者: 尤洋    时间: 2012-8-24 22:05
在这里影响效率的主要因素是对锁的判断,if else判断,对效率的影响比锁要小的多
通过外层if语句判断出是否能够 经过锁,
减少了锁的判断,也就提高了效率。




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