北京北大青鳥(niǎo)學(xué)校學(xué)員總結(jié):java單例設(shè)計(jì)模式(二)

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

      第六種(枚舉):

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

      這種方式不僅能避免多線程同步問(wèn)題,而且還能防止反序列化重新創(chuàng)建新的對(duì)。不過(guò),個(gè)人認(rèn)為由于1.5中才加入enum特性,用這種方式寫不免讓人感覺(jué)生疏,在實(shí)際工作中,我也很少看見(jiàn)有人這么寫過(guò)。(北京北大青鳥(niǎo)學(xué)校,北大青鳥(niǎo)課程)


      第七種(雙重校驗(yàn)鎖):

      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; 
          } 
      }  (北京北大青鳥(niǎo)學(xué)校,北大青鳥(niǎo)課程

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

      總結(jié)

      有兩個(gè)問(wèn)題需要注意:

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

      2.如果Singleton實(shí)現(xiàn)了java.io.Serializable接口,那么這個(gè)類的實(shí)例就可能被序列化和復(fù)原。不管怎樣,如果你序列化一個(gè)單例類的對(duì)象,接下來(lái)復(fù)原多個(gè)那個(gè)對(duì)象,那你就會(huì)有多個(gè)單例類的實(shí)例。(北京北大青鳥(niǎo)學(xué)校,北大青鳥(niǎo)課程)

      對(duì)第一個(gè)問(wèn)題修復(fù)的辦法是:

      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));    
         }    

      對(duì)第二個(gè)問(wèn)題修復(fù)的辦法是:

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

      北京北大青鳥(niǎo)學(xué)校學(xué)術(shù)老師評(píng)價(jià):這位學(xué)員總結(jié)的很到位,很不錯(cuò)。不過(guò)一般來(lái)說(shuō),第一種不算單例,第四種和第三種就是一種,如果算的話,第五種也可以分開(kāi)寫了。所以說(shuō),一般單例都是五種寫法。

      北京北大青鳥(niǎo)學(xué)校學(xué)術(shù)老師鼓勵(lì)今后有更多的北京北大青鳥(niǎo)學(xué)校學(xué)員能與老師一起交流,這樣才能提高學(xué)員的技術(shù)能力。想要了解北大青鳥(niǎo)好嗎?北大青鳥(niǎo)怎么樣?北大青鳥(niǎo)課程?北大青鳥(niǎo)學(xué)費(fèi)多少等問(wèn)題,歡迎您與通州北大青鳥(niǎo)網(wǎng)站在線老師聯(lián)系

      北大青鳥(niǎo)網(wǎng)上報(bào)名
      北大青鳥(niǎo)招生簡(jiǎn)章
      主站蜘蛛池模板: 久久一区二区免费播放| 亚洲国产AV一区二区三区四区| 亚洲AV日韩综合一区尤物| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 日本v片免费一区二区三区| 日韩精品中文字幕无码一区 | 精品午夜福利无人区乱码一区| 韩国福利一区二区三区高清视频| 99偷拍视频精品一区二区 | 国产一区二区福利久久| 亚洲国产成人久久综合一区| 高清一区二区三区免费视频| A国产一区二区免费入口| | 精品无码人妻一区二区三区 | 日韩精品视频一区二区三区| 国产AⅤ精品一区二区三区久久| 动漫精品专区一区二区三区不卡| 在线电影一区二区三区| 国产成人高清亚洲一区久久| 国产精品无码一区二区三区在| 无码一区二区三区| 日韩精品一区二区亚洲AV观看| 午夜福利一区二区三区在线观看 | 国产成人一区二区三区免费视频 | 久久综合九九亚洲一区| 国产无线乱码一区二三区 | 少妇人妻偷人精品一区二区| 三上悠亚精品一区二区久久| 国产一区二区在线看| 无码午夜人妻一区二区三区不卡视频| 亚洲av无码天堂一区二区三区| 无码精品久久一区二区三区| 高清在线一区二区| 痴汉中文字幕视频一区| 99精品高清视频一区二区| 亚洲日韩激情无码一区| 中文字幕日韩一区| 精品国产一区二区三区久久影院| 韩国精品一区视频在线播放 | 亚洲爆乳精品无码一区二区|