單實例模式學(xué)習(xí)筆記


          1. 經(jīng)典的單實例模式例子(非線程安全):
          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
          }
          本例是最經(jīng)典的單實例模式例子,但是在多線程的情況下就會產(chǎn)生多個實例!

          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,會讓該方法是線程安全的,但是會引起每個線程在調(diào)用該方法時的等待,如果getInstance的性能對應(yīng)用程序不是很關(guān)鍵(記住,同步方法可能會使getInstance方法得運行效率降低100倍),本方法是最好得方法!
          3. 提前實例化,不適用延遲實例化(使用于創(chuàng)建和運行時負擔(dān)不太繁重或者應(yīng)用程序總是創(chuàng)建并使用單件實例),它是線程安全得:
          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在加載這個類時候馬上創(chuàng)建此唯一實例,JVM保證在任何線程訪問它之前,一定先創(chuàng)建它!
          4. 在java1.5及以后的版本,增加了volatile關(guān)鍵字,可以采用雙重檢查加鎖!
          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關(guān)鍵字確保:當(dāng)unigueInstance變量在被初始化成實例時,多個線程能夠正確的處理它!(對于關(guān)注性能的程序,這種做法可以大大減少時耗)



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


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


          網(wǎng)站導(dǎo)航:
           
          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(2)

          隨筆分類(31)

          隨筆檔案(30)

          文章分類(32)

          文章檔案(33)

          相冊

          PHP小站-首頁

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遂川县| 泾阳县| 徐汇区| 万年县| 白城市| 大港区| 昌邑市| 衡山县| 兴业县| 兴义市| 舟山市| 永平县| 普陀区| 南川市| 连云港市| 甘孜县| 峨眉山市| 天峨县| 克拉玛依市| 丰都县| 庆元县| 鹤岗市| 玉溪市| 靖安县| 化隆| 聂拉木县| 那曲县| 驻马店市| 阳春市| 新干县| 泸西县| 淮南市| 醴陵市| 方山县| 武功县| 都兰县| 扶沟县| 团风县| 株洲县| 汉源县| 沅陵县|