夢幻之旅

          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
          主站蜘蛛池模板: 乌什县| 巨野县| 始兴县| 奉贤区| 小金县| 博客| 通山县| 宜君县| 岢岚县| 百色市| 景东| 唐山市| 黄山市| 铜川市| 黑水县| 沧源| 绥德县| 丽江市| 瑞安市| 江源县| 合作市| 珠海市| 赤峰市| 康定县| 开原市| 称多县| 内江市| 大宁县| 凤山县| 乌审旗| 莱阳市| 八宿县| 宁化县| 炉霍县| 福海县| 峨山| 屯留县| 隆化县| 徐水县| 宁津县| 井研县|