單實例模式學習筆記


          1. 經典的單實例模式例子(非線程安全):
          public class Singleton {
              private static Singleton uniqueInstance;
           
              // other useful instance variables here
           
              private Singleton() {}
           
              public static Singleton getInstance() {
                  if (uniqueInstance == null) {
                  uniqueInstance = new Singleton();
               }
                   return uniqueInstance;
              }
           
              // other useful methods here
          }
          本例是最經典的單實例模式例子,但是在多線程的情況下就會產生多個實例!

          2. 線程安全的例子:
          public class Singleton {
           private static Singleton uniqueInstance;
           
           // other useful instance variables here
           
           private Singleton() {}
           
           public static synchronized Singleton getInstance() {
            if (uniqueInstance == null) {
             uniqueInstance = new Singleton();
            }
            return uniqueInstance;
           }
           
           // other useful methods here
          }
          增加synchronized,會讓該方法是線程安全的,但是會引起每個線程在調用該方法時的等待,如果getInstance的性能對應用程序不是很關鍵(記住,同步方法可能會使getInstance方法得運行效率降低100倍),本方法是最好得方法!
          3. 提前實例化,不適用延遲實例化(使用于創建和運行時負擔不太繁重或者應用程序總是創建并使用單件實例),它是線程安全得:
          public class Singleton {
              private static Singleton uniqueInstance = new Singleton();

              // other useful instance variables here
           
              private Singleton() {}
           
              public static Singleton getInstance() {
                      return uniqueInstance;
              }
           
              // other useful methods here
          }
          采用這種方法,我們依賴JVM在加載這個類時候馬上創建此唯一實例,JVM保證在任何線程訪問它之前,一定先創建它!
          4. 在java1.5及以后的版本,增加了volatile關鍵字,可以采用雙重檢查加鎖!
          public class Singleton {
           private volatile static Singleton uniqueInstance;
           
           private Singleton() {}
           
           public static Singleton getInstance() {
            if (uniqueInstance == null) {
             synchronized (Singleton.class) {
              if (uniqueInstance == null) {
               uniqueInstance = new Singleton();
              }
             }
            }
            return uniqueInstance;
           }
          }
          volatile關鍵字確保:當unigueInstance變量在被初始化成實例時,多個線程能夠正確的處理它!(對于關注性能的程序,這種做法可以大大減少時耗)



          posted on 2008-05-04 08:38 扭轉乾坤 閱讀(675) 評論(0)  編輯  收藏 所屬分類: 設計模式


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


          網站導航:
           
          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類(31)

          隨筆檔案(30)

          文章分類(32)

          文章檔案(33)

          相冊

          PHP小站-首頁

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 思茅市| 甘南县| 平利县| 陵川县| 横峰县| 阿鲁科尔沁旗| 禄劝| 花垣县| 伊通| 许昌县| 墨玉县| 高唐县| 舞阳县| 庆元县| 南康市| 铜梁县| 宜黄县| 伊川县| 东乌珠穆沁旗| 邵阳县| 宜宾市| 宝应县| 彰武县| 镇宁| 云阳县| 南丰县| 类乌齐县| 靖西县| 鹤壁市| 双柏县| 滨海县| 称多县| 建平县| 周口市| 永兴县| 息烽县| 大姚县| 尚志市| 太湖县| 沾化县| 德清县|