明月松間照 清泉石上流


                                                  ——— 兵臨城下   貓科動物
          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 小賀
          第一種是類加載時生成實例,第二種是調用方法時生成實例,生成實例也要占用內存影響效率,在需要的時候再生成實例,感覺第二種更有效率。
          主站蜘蛛池模板: 上虞市| 齐河县| 禄丰县| 永丰县| 嘉义县| 临泽县| 灯塔市| 汾阳市| 富蕴县| 高要市| 清流县| 清远市| 滁州市| 来凤县| 土默特左旗| 灵台县| 安徽省| 香港| 郁南县| 庆安县| 马龙县| 建昌县| 马山县| 金寨县| 鹤峰县| 墨脱县| 青河县| 桦南县| 郑州市| 合山市| 佛山市| 石渠县| 万宁市| 南召县| 夏邑县| 梅河口市| 滁州市| 搜索| 黔江区| 分宜县| 裕民县|