單實例模式學習筆記


          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小站-首頁

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 万山特区| 丰原市| 石台县| 贞丰县| 梓潼县| 图片| 磐石市| 成都市| 南木林县| 鄂托克前旗| 彭阳县| 湖北省| 确山县| 昭通市| 南木林县| 宕昌县| 漠河县| 临海市| 东宁县| 博野县| 屏边| 塘沽区| 吉隆县| 越西县| 桃江县| 巴彦县| 大港区| 安仁县| 买车| 金堂县| 苏尼特右旗| 萨迦县| 北安市| 剑河县| 唐海县| 漠河县| 宝兴县| 江孜县| 鄯善县| 丰顺县| 香格里拉县|