夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          1.在何時使用:
             在某些情況下,我們只需要一個類只能實例化一個對象,在這種情況下,可以使用單件.
          2.uml類圖

          3.使用單例模式的好處.
             單類的唯一實例由單件類本控制的,所以可以很好地控制只有一個實現.
           使用Singleton的好處還在于可以節省內存因為它限制了實例的個數,有利于Java垃圾回收(garbage collection).

          4.例子
           1).餓漢式單件,
          /**
           * <ul>
           * <li>Title:[SingletomA]</li>
           * <li>Description: [單例]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-7-24]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
           * 
          @version 1.0
           
          */

          public class SingletomA
          {
              
          private static SingletomA singletom = new SingletomA();
              
              
          private SingletomA()
              
          {}
              
              
          public static SingletomA getInstance()
              
          {
                  
          return singletom;
              }

          }


             2). 懶漢式單件
           
          /**
           * <ul>
           * <li>Title:[SingletomB]</li>
           * <li>Description: [懶漢式單態]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-7-24]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
          @version 1.0  
           
          */

          public class SingletomB
          {
              
              
          private static SingletomB singletom;
              
              
          private SingletomB()
              
          {}
              
              
          public static SingletomB getInstance()
              
          {
                  
          if (singletom == null)
                  
          {
                      singletom 
          = new SingletomB();
                  }

                  
          return singletom;
              }

          }

               這個單例模式是不安全的,為什么說呢 ?因為沒考慮多線程,如下情況
               Thread 1 調用getInstance() 方法,并且判斷instance是null,然後進入if模塊,在實例化instance之前,Thread 2搶占了Thread 1的cpu。Thread 2 調用getInstance() 方法,并且判斷instance是null,然後進入if模塊,Thread 2 實例化instance 完成,返回Thread 1 再次實例化instance
                  這個單例已經不在是單例
           
          3).線程安全式單態
             
          /**
           * <ul>
           * <li>Title:[SingletomB]</li>
           * <li>Description: [懶漢式單態]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-7-24]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
          @version 1.0  
           
          */

          public class SingletomB
          {
              
              
          private static SingletomB singletom;
              
              
          private SingletomB()
              
          {}
              
              
          public static synchronized SingletomB getInstance()
              
          {
                  
          if (singletom == null)
                  
          {
                      singletom 
          = new SingletomB();
                  }

                  
          return singletom;
              }

          }
          采用同步來解決,這種方式解決了問題,但是仔細分析正常的情況下只有第一次時候,進入對象的實例化,須要同步,其它時候都是直接返回已經實例化好的instance不須要同步,大家都知到在一個多線程的程序中,如果同步的消耗是很大的,很容易造成瓶頸.

          4.改進型
          利用Double-checked locking 兩次同步,中間變量,解決上邊的問題。
          /**
           * <ul>
           * <li>Title:[SingletomB]</li>
           * <li>Description: [懶漢式單態]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-7-24]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
           * 
          @version 1.0
           
          */

          public class SingletomB
          {
              
              
          private static SingletomB singletom;
              
              
          private SingletomB()
              
          {}
              
              
          public static SingletomB getInstance()
              
          {
                  
          if (singletom == null)
                  
          {
                      
          synchronized (SingletomB.class)
                      
          {
                          
          if (singletom == null)
                              singletom 
          = new SingletomB();
                      }

                  }

                  
          return singletom;
              }

          }
          posted on 2011-07-24 15:18 HUIKK 閱讀(236) 評論(0)  編輯  收藏 所屬分類: Design Patterns
          主站蜘蛛池模板: 锡林浩特市| 通许县| 固原市| 北川| 开阳县| 民丰县| 醴陵市| 白沙| 宁武县| 嘉鱼县| 鸡泽县| 鹤庆县| 新闻| 乳源| 齐河县| 闻喜县| 化隆| 昭觉县| 烟台市| 泸溪县| 金坛市| 搜索| 始兴县| 怀来县| 石阡县| 鱼台县| 德清县| 古浪县| 剑阁县| 开原市| 丰都县| 玉龙| 东台市| 达孜县| 固阳县| 滨海县| 衢州市| 蓝山县| 孝感市| 东兰县| 遂溪县|