再論Singleton模式

          Singleton模式可能是應用最廣泛的模式之一了, 但有些錯誤的應用。
          ?Singleton的實現: 有兩種方式, 如下:
          1. class Test { public static final Test instance = new Test(); private Test() {} }
          ?2. class Test { private static final Test instance = new Test(); private Test() {} public static Test getInstance() { return instance; } } 這兩種方法都要求構造器是私有的, 這樣就可以防止該類外的對象創(chuàng)建新的TEST對象。 但相對而言, 推薦使用第二種方法, 因為其更具有靈活性,當我們改變創(chuàng)建對象的方式的時候, 不需要改動客戶代碼。 第一種方法較第二種有一點完全可以忽略不計的效率的提高。
          ?但應避免如下代碼實現Singleton: class Test { private static Test singleton = null; private Test() {} public Test getSingleton() { if(singleton == null) { singleton = new Test(); } return singleton; } } 因為嚴格上講, 這并不能完全實現Singleton模式,而且會導致程序出錯, 這同著名的線程問題--DCL實效的原理是完全一樣的:
          JVM創(chuàng)建對象的過程可以分為幾個步驟:創(chuàng)建空間, 把所有的變量賦值位默認值, 初始化。。。 當有兩個線程A和B同事進入該方法, A先執(zhí)行, A創(chuàng)建Test實例的空間, 這時,因為CPU的指令流機制,時間片段正好輪到B線程, 這時B判斷singleton是否為NULL, 因為A已經為Test的實例分配了空間, 所以JVM認為實例已經創(chuàng)建了, B繼續(xù)執(zhí)行, 更糟糕的是B調用了singleton, 這時因為他并沒有初始化完全, 所以拋出NullPointerException, 太糟糕了!

          posted on 2006-10-30 14:10 Sheldon Sun 閱讀(189) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 炎陵县| 仁怀市| 洞头县| 平阴县| 高尔夫| 文登市| 博乐市| 宁城县| 沂南县| 三明市| 含山县| 衡东县| 古田县| 鹤岗市| 辽阳市| 通州市| 双城市| 上林县| 浦江县| 东台市| 大城县| 手机| 泾阳县| 罗甸县| 全椒县| 河东区| 华容县| 扶余县| 仁寿县| 黑山县| 黄梅县| 镇赉县| 信丰县| 昭通市| 台南县| 奈曼旗| 宁河县| 牙克石市| 全州县| 纳雍县| 富顺县|