黑马程序员技术交流社区

标题: if和锁的效率问题 [打印本页]

作者: walkonby    时间: 2013-1-27 21:41
标题: if和锁的效率问题

这个是懒汉式的判断
同样的是每次进来都要判断
加上外面一个判断在不为null的时候还会多判断几次(如果多几个线程还会那么巧的话 )
为什么在外面加if(s==null)这种方式比锁效率更高呢
是单纯的判断null效率比较高还是说锁的判断不是一般的判断
求详细解释下 thank.

作者: 王立浩    时间: 2013-1-27 21:48
我觉得是同步代码块会降速很多   应该尽量避免其他线程接触到同步锁的判断    外层加个判断就能实现这个目的了
作者: 黄锦成    时间: 2013-1-27 23:21
如果不用外层的if的话,那么每次都会判断synchronized,判断synchronized是很耗资源的。在外层加个if,那么s有了值之后,第一个if都通过不了,就不会去判断synchronized了,保证了性能
作者: 刘军亭    时间: 2013-1-27 23:24
效率高说的是在对象创建出来以后,如果第一次效率是低的。如果对象不为空的话,下面的锁还有if判断都不用判断了,那是不是效率高了呢。

if(s == null){
  synchronized(Single.class){
     if(s == null)
        s = new Single();
  }
}
作者: 张敬培    时间: 2013-1-28 00:54
这样做是为了提高效率。
在多线程中,这样做是为了确保已经获得过一次s的线程不会再去初始化第二次
举例:
  1. /*
  2. * 分析:
  3. * 1、当两个线程同时要对st进行初始化时,当a线程判断st为null时,开始对st进行初始化,a还没有初始化完成b线程也要对st进行初始化,
  4. *   这是判断st也为null,也开始对st进行初始化,这就违背类单例模式的初衷了。所以要在if判断进行同步处理
  5. * 2、进行完同步处理后,线程安全了,但是效率太低。因为每个线程都要等待前一个判断时候为null后,才能进行下一个线程的判断,这样会导致许多线程等待
  6. * 3、由于等待线程太多,这样就会导致效率低,如果在同步代码块前面增加一个判断语句,当st为空,才会进入到同步块,这样就会减少同步块的等待线程数量
  7. */
  8. class SingleThread{
  9.         private static SingleThread st;
  10.         private SingleThread(){}
  11.        
  12.         public static SingleThread getSt(){
  13.        
  14.                 /*
  15.                  * 判断st时候已经实例化完成。
  16.                  * 如果没有完成,那么就执行下面的语句
  17.                  * 如果已经完成初始化,那么就不执行直接返回st
  18.                  */
  19.                 if(st == null){
  20.                         //在第一个线程初始化完成以前,有可能还有线程进来有进行初始化,这是用来把这样的线程挡在外面的
  21.                         synchronized (SingleThread.class) {
  22.                                 //如果st为null就进行初始化
  23.                                 if(st == null){
  24.                                         st = new SingleThread();
  25.                                 }
  26.                         }
  27.                 }
  28.                 return st;
  29.         }
  30. }
复制代码

作者: walkonby    时间: 2013-1-28 09:00
黄锦成 发表于 2013-1-27 23:21
如果不用外层的if的话,那么每次都会判断synchronized,判断synchronized是很耗资源的。在外层加个if,那么s ...

学长啊 他这个锁里面的判断是个什么原理啊 其实我估计也是锁比if耗资源 但是他是怎么个耗费资源法的呢
作者: 黄锦成    时间: 2013-1-28 10:48
张政 发表于 2013-1-28 09:00
学长啊 他这个锁里面的判断是个什么原理啊 其实我估计也是锁比if耗资源 但是他是怎么个耗费资源法的呢 ...

锁有个标识位,好像是0和1。
作者: walkonby    时间: 2013-1-28 12:59
黄锦成 发表于 2013-1-28 10:48
锁有个标识位,好像是0和1。

.. 那个貌似是毕老师打的个比喻啊. 如果真是直接判断0 1 的话 那锁也不是很耗费资源把.
作者: 黄锦成    时间: 2013-1-28 13:04
张政 发表于 2013-1-28 12:59
.. 那个貌似是毕老师打的个比喻啊. 如果真是直接判断0 1 的话 那锁也不是很耗费资源把. ...

关键是每次只能有一个线程得到锁。如果有n个线程,其中一个线程得到锁,就有n-1个在等待,那么系统性能就降低了。说法有点错了,应该是性能,而不是耗费资源。
作者: walkonby    时间: 2013-1-28 17:33
黄锦成 发表于 2013-1-28 13:04
关键是每次只能有一个线程得到锁。如果有n个线程,其中一个线程得到锁,就有n-1个在等待,那么系统性能就 ...

还是有些疑问 等会QQ上问你把 反正分搞到了 哈哈




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