zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0
          老關者,吾同學也。哈哈,今天看他的博客,對單態模式又有了進一步的理解。
          以前使用的單態模式,也能實現,不過有個限制,看下面的代碼
          import java.util.*;
          class Singleton
          {
          private static Singleton instance;

          private Singleton()
          {
          }

          public static Singleton getInstance()
          {
          if (instance == null) //1
          instance = new Singleton(); //2
          return instance; //3
          }
          }
          這就是我們常使用的單態模式。
          現在,我們作一個假設,如果兩個線程同時執行此程序,都剛執行完1,到2,還沒有之行,停住。
          此時
          thread1得到的instance是null
          thread2得到的instance也是null
          下面會如何呢?
          顯然,兩個線程會分別創建和初始化一個new Singleton()對象。
          那么,我們的單態還能實現單態的功能嗎?不能。
          不過,這是個特例,只有在多線程程序,同時兩個或多個線程都執行到1還沒有執行2的時候才能出現。也就是說,如果沒有實現方法的同步的話,上面的模式是不能保證生成一個實例的。
          如果是在非多線程的程序中就更不會出現這樣的問題。
          但是,些程序是一個嚴密的工作。所以,程序要在任何情況和平臺下都是正確的。

          希望,通過此文,你也能明白,為什么上面的單態模式是不安全的,為什么這種實現方法有生成多個實例的可能?
          想更深入的理解,請參考
          http://guanhw.blog.hexun.com/10653016_d.html


          |----------------------------------------------------------------------------------------|
                                     版權聲明  版權所有 @zhyiwww
                      引用請注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2008-02-15 13:27 zhyiwww 閱讀(884) 評論(2)  編輯  收藏 所屬分類: j2ee

          FeedBack:
          # re: 跟老關學單態模式
          2008-02-15 16:44 | honeyjava
          有必要用JCF中的類嗎,不知道你那個vector干什么用的,很沒意思。單例模式已經不能再成熟了,double-check式的已經被認為是線程不安全的。  回復  更多評論
            
          # re: 跟老關學單態模式
          2008-02-18 16:21 | zhyiwww
          @honeyjava
          現在是我修改后的代碼。
          import java.util.*;
          class Singleton
          {
          private static Singleton instance;

          private Singleton()
          {
          }

          public static Singleton getInstance()
          {
          if (instance == null) //1
          instance = new Singleton(); //2
          return instance; //3
          }
          }
          當時就是摘抄的一段代碼,只是為了能說明問題。
          不過,聽了您的說明,我對此模式有糊涂了。如果說上面的方法也是不安全的,那么哪一種方式是安全的呢?歡迎指導。  回復  更多評論
            
          主站蜘蛛池模板: 汾阳市| 南漳县| 盘锦市| 五家渠市| 达孜县| 巫山县| 平湖市| 漾濞| 鱼台县| 凤山市| 汾西县| 双牌县| 临湘市| 山东省| 扎赉特旗| 长泰县| 通化县| 铅山县| 兰西县| 交城县| 高阳县| 阳西县| 法库县| 内黄县| 孟连| 日土县| 响水县| 凉山| 佛山市| 博野县| 高安市| 边坝县| 兴城市| 内江市| 文安县| 青阳县| 邵阳市| 新化县| 新田县| 平邑县| 永泰县|