以下是毕向东老师视频教程中关于单例设计模式的懒汉式的代码- class Single
- {
- private static Single s = null;//此处不能加final
- private Single(){}
- public static Single getInstance()
- {
- if(s==null)
- s = new Single();
- return s;
- }
- }
复制代码 以下是加入了线程同步代码块,问题见单行注释。
- public static Single getInstance()
- {
- <p style="line-height: 30px; text-indent: 2em;"></p><p style="line-height: 30px; text-indent: 2em;"></p> if(s==null)
- {
- synchronized (Single.class)//可以减少判断锁的次数,所以效率高
- {
- if(s==null)//此处为何还要再次判断s是否为null?
- s = new Single();
- }
- }
- return s;
- }
复制代码 如果在执行此代码时,s已经指向了实例,那么if代码块就不会执行,因此没有必要在其中再次判断s是否为null
如果在执行此代码时,s还没有指向实例,那么进入同步代码块后,也没有必要判断s是否为null,因为s此时必然为null啊,直接创建对象就好了。
|
|