單實例模式學習筆記


          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 扭轉乾坤 閱讀(671) 評論(0)  編輯  收藏 所屬分類: 設計模式


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


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

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類(31)

          隨筆檔案(30)

          文章分類(32)

          文章檔案(33)

          相冊

          PHP小站-首頁

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 江口县| 西丰县| 大悟县| 巴林左旗| 咸丰县| 东明县| 香河县| 贵溪市| 三门县| 巴中市| 隆安县| 大田县| 南阳市| 龙泉市| 曲沃县| 乌什县| 柞水县| 景泰县| 大荔县| 郓城县| 乌审旗| 交城县| 普安县| 辰溪县| 内丘县| 澄迈县| 乾安县| 昭平县| 沁源县| 辰溪县| 宽城| 陈巴尔虎旗| 视频| 海城市| 上林县| 汉源县| 堆龙德庆县| 西盟| 青冈县| 新昌县| 神农架林区|