北京北大青鳥學校學員總結:java單例設計模式(二)

      大家好,我是北京北大青鳥學校軟件工程師培訓課程的一名學員。上一篇文章中,我根據自己的理解,總結了java單例設計模式的幾種方式。這篇文章,我將繼續總結,并希望大家和北京北大青鳥學校的老師給予建議和指導。

      第六種(枚舉):

      Java代碼
      public enum Singleton { 
          INSTANCE; 
          public void whateverMethod() { 
          } 

      這種方式不僅能避免多線程同步問題,而且還能防止反序列化重新創建新的對。不過,個人認為由于1.5中才加入enum特性,用這種方式寫不免讓人感覺生疏,在實際工作中,我也很少看見有人這么寫過。(北京北大青鳥學校,北大青鳥課程)


      第七種(雙重校驗鎖):

      Java代碼
      public class Singleton { 
          private volatile static Singleton singleton; 
       
          public static Singleton getSingleton() { 
          if (singleton == null) { 
              synchronized (Singleton.class) { 
              if (singleton == null) { 
                  singleton = new Singleton(); 
              } 
              } 
          } 
          return singleton; 
          } 
      }  (北京北大青鳥學校,北大青鳥課程

       這個是第二種方式的升級版,俗稱雙重檢查鎖定。在JDK1.5之后,雙重檢查鎖定才能夠正常達到單例效果。

      總結

      有兩個問題需要注意:

      1.如果單例由不同的類裝載器裝入,那便有可能存在多個單例類的實例。假定不是遠端存取,例如一些servlet容器對每個servlet使用完全不同的類裝載器,這樣的話如果有兩個servlet訪問一個單例類,它們就都會有各自的實例。

      2.如果Singleton實現了java.io.Serializable接口,那么這個類的實例就可能被序列化和復原。不管怎樣,如果你序列化一個單例類的對象,接下來復原多個那個對象,那你就會有多個單例類的實例。(北京北大青鳥學校,北大青鳥課程)

      對第一個問題修復的辦法是:

      Java代碼
      private static Class getClass(String classname)     
                                               throws ClassNotFoundException {    
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();    
           
            if(classLoader == null)    
               classLoader = Singleton.class.getClassLoader();    
           
            return (classLoader.loadClass(classname));    
         }    

      對第二個問題修復的辦法是:

      Java代碼
      public class Singleton implements java.io.Serializable {    
         public static Singleton INSTANCE = new Singleton();    
           
         protected Singleton() {    
             
         }    
         private Object readResolve() {    
                  return INSTANCE;    
            }   
      }   (北京北大青鳥學校,北大青鳥課程
       
      我個人比較喜歡第三種和第五種方式,簡單易懂,而且在JVM層實現了線程安全(如果不是多個類加載器環境),一般的情況下,我會使用第三種方式,只有在要明確實現lazy loading效果時才會使用第五種方式,另外,如果涉及到反序列化創建對象時我會試著使用枚舉的方式來實現單例,不過,我一直會保證我的程序是線程安全的,而且我永遠不會使用第一種和第二種方式,如果有其他特殊的需求,我可能會使用第七種方式,畢竟,JDK1.5已經沒有雙重檢查鎖定的問題了。以上是我的總結,希望北京北大青鳥學校老師幫助提些建議。

      北京北大青鳥學校學術老師評價:這位學員總結的很到位,很不錯。不過一般來說,第一種不算單例,第四種和第三種就是一種,如果算的話,第五種也可以分開寫了。所以說,一般單例都是五種寫法。

      北京北大青鳥學校學術老師鼓勵今后有更多的北京北大青鳥學校學員能與老師一起交流,這樣才能提高學員的技術能力。想要了解北大青鳥好嗎?北大青鳥怎么樣?北大青鳥課程?北大青鳥學費多少等問題,歡迎您與通州北大青鳥網站在線老師聯系

      北大青鳥網上報名
      北大青鳥招生簡章
      主站蜘蛛池模板: 国产亚洲一区二区在线观看| 韩日午夜在线资源一区二区| 亚洲欧洲∨国产一区二区三区| 国产精品免费一区二区三区四区| 成人精品一区二区三区电影| 3d动漫精品啪啪一区二区中文| 久久久精品日本一区二区三区| 日本在线视频一区二区三区| 精品国产一区AV天美传媒| 久久久久国产一区二区| 99偷拍视频精品一区二区| 亚洲欧洲精品一区二区三区| 国产爆乳无码一区二区麻豆| 亚洲色欲一区二区三区在线观看| 一区二区三区高清视频在线观看| 精品日韩一区二区| 久久久久人妻精品一区三寸| 亚洲欧美日韩一区二区三区在线| 亚洲一区中文字幕在线观看| 精品无码一区二区三区爱欲九九| 一区二区三区国产精品 | 国模大尺度视频一区二区| 精品在线视频一区| 国产精品一区二区无线| 国产一区二区三区在线免费观看| 国产精品盗摄一区二区在线| 无码视频一区二区三区| 国精产品一区一区三区有限公司 | 精品国产一区二区22| 亚洲福利视频一区二区| 国产精品亚洲产品一区二区三区 | 久久影院亚洲一区| 中文字幕aⅴ人妻一区二区| 国产精品丝袜一区二区三区 | 中文字幕VA一区二区三区 | 日韩精品人妻一区二区三区四区 | 无码人妻精品一区二区三区蜜桃| 日本免费一区二区三区四区五六区| 91在线精品亚洲一区二区| 精品视频一区二区三区四区| 国产伦精品一区二区三区免.费 |