明月松間照 清泉石上流


                                                  ——— 兵臨城下   貓科動物
          posts - 70, comments - 137, trackbacks - 0, articles - 23
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          singleton的一點疑問

          Posted on 2006-11-29 15:07 兵臨城下 閱讀(442) 評論(7)  編輯  收藏 所屬分類: Java EE
          一般Singleton模式通常有幾種形式:
          第一種形式:

          public class Singleton {

            private Singleton(){}

            private static Singleton instance = new Singleton();

            public static Singleton getInstance() {
              return instance;   
             }
          }

          第二種形式:

          public class Singleton {

            private static Singleton instance = null;
          ?????????
          ????????private Singleton(){}

            public static synchronized Singleton getInstance() {

            if (instance==null)
              instance=new Singleton();
            return instance;   }

          }

          都說第二種形式是lazy initialization,也就是說第一次調用時初始Singleton,不用每次都進行生成對象實例,提高了效率。
          我的疑問是:第一種形式每次通過Singleton.getInstance()就會多次生成實例嗎?instance 不是static的嗎,也只初始化一次啊!
          還有第二種形式中的synchronized 為什么是必須的?不明白,望指點!

          評論

          # re: singleton的一點疑問  回復  更多評論   

          2006-11-29 18:19 by jrobot_堪
          第一種形式也不會生成多個實例的,每次都是返回的類初始化時構造的對象
          第二種形式由于在調用方法時才生成實例并返回,考慮到可能多線程同時訪問這個方法時,可能生成多個實例的情況,必須加synchronized關鍵字讓方法變為同步,這樣同一時間只能一個線程執行這個方法.

          # re: singleton的一點疑問  回復  更多評論   

          2006-11-29 21:56 by 兵臨城下
          哦!線程安全!懂了,那相比而言,第一種形式是比較安全的。
          那第二種形式并不比第一種形式效率高啊,怎么說是提高了效率呢?

          # re: singleton的一點疑問  回復  更多評論   

          2006-11-30 02:59 by jrobot[匿名]
          個人感覺對一般的程序普通的這兩種寫法都是可以的
          至于效率,應該是第一種高些,因為沒有同步,不過也可能會有問題
          這有一篇文章,超詳細的米仔細看- -,你感興趣去研究吧
          http://www.aygfsteel.com/dreamstone/archive/2006/11/04/79026.aspx

          # re: singleton的一點疑問  回復  更多評論   

          2006-11-30 09:24 by 兵臨城下
          謝了,太復雜了,字節碼分析!
          以后就用第一種形式了!

          # re: singleton的一點疑問  回復  更多評論   

          2006-11-30 18:42 by Zou Ang
          我覺得是因為第一種方式會在類加載的時候就初始化instance,而第二種會在使用時初始化,中間有一段時間不用吧~~

          # re: singleton的一點疑問  回復  更多評論   

          2006-11-30 19:58 by 兵臨城下
          不對吧,這兩個單態類只能通過Singleton.getInstance()來創建對象,所以應該都是調用時才初始化,不存在你所說的情況!

          # re: singleton的一點疑問  回復  更多評論   

          2006-12-10 05:07 by 小賀
          第一種是類加載時生成實例,第二種是調用方法時生成實例,生成實例也要占用內存影響效率,在需要的時候再生成實例,感覺第二種更有效率。
          主站蜘蛛池模板: 将乐县| 凤台县| 裕民县| 泸定县| 蒙山县| 略阳县| 大方县| 静安区| 秦皇岛市| 旬阳县| 峡江县| 兴化市| 桃园市| 左贡县| 鄂伦春自治旗| 尉氏县| 昌吉市| 内黄县| 克拉玛依市| 巴南区| 昌平区| 无锡市| 甘德县| 黑河市| 松潘县| 石阡县| 吐鲁番市| 宁城县| 龙南县| 德保县| 蕉岭县| 湟源县| 海南省| 驻马店市| 丹棱县| 星子县| 东丰县| 湟源县| 中方县| 托克托县| 鄯善县|