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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈君 于 2014-8-10 20:21 编辑

下面先说下毕老师的写法:
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;
     }
}
我觉得我这样写的话会更好吧:
  1. class Single
  2. {

  3. private static Single s=null;

  4. private Single(){}

  5. public static Single getInstance()

  6. {

  7. if(s==null)

  8. {

  9. synchronized(Single.class)

  10. {



  11. s=new Single();

  12. }

  13. }

  14. return s;

  15. }

  16. }
复制代码

  1. <P> </P>
复制代码

8 个回复

倒序浏览
好吧,我想通了,还是毕老师的好
回复 使用道具 举报
  1. class Single
  2. {
  3.       private static Single s=null;
  4.       private Single(){}
  5.       public static Single getInstance()
  6.      {
  7.             if(s==null)
  8.            { 假设A  B两个线程执行到这里,A先进去了
  9.                  synchronized(Single.class)
  10.                  {
  11. //if(s==null)//如果这里被注释, A创建完出来,B进来就会又创建了对象,所以这一行千万不能省,
  12.                       s=new Single();
  13.                  }
  14.            }
  15.           return s;
  16.      }
  17. }
复制代码


回复 使用道具 举报
楼上正解,道破天机。。。
回复 使用道具 举报
恩 可能是synchronized的代价远大于if(s==null)产生的代价,如果只判断s==null就不用重复进synchronized再判断了
回复 使用道具 举报
这不是版主吗?版主你好!那个,其实网上有一种改进型的懒汉式。名为Lazy initialization holder class。
这种延迟加载的代码示例如下:
  1. public class Singleton {  
  2.     /**
  3.      * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
  4.      * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
  5.      */  
  6.     private static class SingletonHolder{  
  7.         /**
  8.          * 静态初始化器,由JVM来保证线程安全
  9.          */  
  10.         private static Singleton instance = new Singleton();  
  11.     }  
  12.     /**
  13.      * 私有化构造方法
  14.      */  
  15.     private Singleton(){  
  16.     }  
  17.     public static  Singleton getInstance(){  
  18.         return SingletonHolder.instance;  
  19.     }  
  20. }
复制代码

这个解决方案的优势在于:getInstance方法并没有被同步,并且只是执行的一个域的访问,因此延迟初始化并没有增加任何访问成本。
版主再见!
回复 使用道具 举报
kakasa 中级黑马 2014-8-11 09:56:41
7#
来学习了 。

懒汉 饿汉真很重要么,好多人纠结
回复 使用道具 举报
陈君 金牌黑马 2014-8-11 11:18:42
8#
a6511631 发表于 2014-8-11 08:37
这不是版主吗?版主你好!那个,其实网上有一种改进型的懒汉式。名为Lazy initialization holder class。
...

我只是,net的版主
回复 使用道具 举报
论坛真是高手多多啊又学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马