久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

java線程安全的單例模式

 騰飛工作室 2014-02-15

面試的時(shí)候,常常會(huì)被問到這樣一個(gè)問題:請您寫出一個(gè)單例模式(Singleton Pattern)吧,。好吧,寫就寫,,這還不容易,。順手寫一個(gè):

  1. public final class EagerSingleton     
  2. {     
  3.     private static EagerSingleton singObj = new EagerSingleton();     
  4.      
  5.     private EagerSingleton(){     
  6.     }     
  7.      
  8.     public static EagerSingleton getSingleInstance(){     
  9.        return singObj;   
  10.     }     
  11. }     


這種寫法就是所謂的饑餓模式,,每個(gè)對象在沒有使用之前就已經(jīng)初始化了,。這就可能帶來潛在的性能問題:如果這個(gè)對象很大呢?沒有使用這個(gè)對象之前,,就把它加載到了內(nèi)存中去是一種巨大的浪費(fèi),。針對這種情況,我們可以對以上的代碼進(jìn)行改進(jìn),,使用一種新的設(shè)計(jì)思想——延遲加載(Lazy-load Singleton),。

  1. public final class LazySingleton     
  2. {     
  3.     private static LazySingleton singObj = null;     
  4.      
  5.     private LazySingleton(){     
  6.     }     
  7.      
  8.     public static LazySingleton getSingleInstance(){     
  9.         if(null == singObj ) singObj = new LazySingleton();   
  10.           return singObj;   
  11.     }     
  12. }   


這種寫法就是所謂的懶漢模式,。它使用了延遲加載來保證對象在沒有使用之前,,是不會(huì)進(jìn)行初始化的。但是,,通常這個(gè)時(shí)候面試官又會(huì)提問新的問題來刁難一下,。他會(huì)問:這種寫法線程安全嗎?回答必然是:不安全,。這是因?yàn)樵诙鄠€(gè)線程可能同時(shí)運(yùn)行到第九行,,判斷singObj為null,于是同時(shí)進(jìn)行了初始化,。所以,,這是面臨的問題是如何使得這個(gè)代碼線程安全?很簡單,,在那個(gè)方法前面加一個(gè)Synchronized就OK了,。

  1. public final class ThreadSafeSingleton     
  2. {     
  3.     private static ThreadSafeSingleton singObj = null;     
  4.      
  5.     private ThreadSafeSingleton(){     
  6.     }     
  7.      
  8.     public static Synchronized ThreadSafeSingleton getSingleInstance(){     
  9.         if(null == singObj ) singObj = new ThreadSafeSingleton();   
  10.             return singObj;   
  11.     }     
  12. }     

寫到這里,,面試官可能仍然會(huì)狡猾的看了你一眼,,繼續(xù)刁難到:這個(gè)寫法有沒有什么性能問題呢?答案肯定是有的,!同步的代價(jià)必然會(huì)一定程度的使程序的并發(fā)度降低,。那么有沒有什么方法,,一方面是線程安全的,有可以有很高的并發(fā)度呢,?我們觀察到,,線程不安全的原因其實(shí)是在初始化對象的時(shí)候,所以,,可以想辦法把同步的粒度降低,,只在初始化對象的時(shí)候進(jìn)行同步。這里有必要提出一種新的設(shè)計(jì)思想——雙重檢查鎖(Double-Checked Lock),。

  1. public final class DoubleCheckedSingleton     
  2. {     
  3.     private static DoubleCheckedSingletonsingObj = null;     
  4.      
  5.     private DoubleCheckedSingleton(){     
  6.     }     
  7.      
  8.     public static DoubleCheckedSingleton getSingleInstance(){     
  9.         if(null == singObj ) {   
  10.               Synchronized(DoubleCheckedSingleton.class){   
  11.                      if(null == singObj)   
  12.                            singObj = new DoubleCheckedSingleton();   
  13.               }   
  14.          }   
  15.        return singObj,;   
  16.     }     
  17. }     

這種寫法使得只有在加載新的對象進(jìn)行同步,在加載完了之后,,其他線程在第九行就可以判斷跳過鎖的的代價(jià)直接到第15行代碼了,。做到很好的并發(fā)度。

     至此,,上面的寫法一方面實(shí)現(xiàn)了Lazy-Load,,另一個(gè)方面也做到了并發(fā)度很好的線程安全,一切看上很完美,。這是,,面試官可能會(huì)對你的回答滿意的點(diǎn)點(diǎn)頭。但是,,你此時(shí)提出說,,其實(shí)這種寫法還是有問題的!,!問題在哪里,?假設(shè)線程A執(zhí)行到了第9行,它判斷對象為空,,于是線程A執(zhí)行到第12行去初始化這個(gè)對象,,但初始化是需要耗費(fèi)時(shí)間的,但是這個(gè)對象的地址其實(shí)已經(jīng)存在了,。此時(shí)線程B也執(zhí)行到了第九行,它判斷不為空,,于是直接跳到15行得到了這個(gè)對象,。但是,這個(gè)對象還沒有被完整的初始化,!得到一個(gè)沒有初始化完全的對象有什么用?。£P(guān)于這個(gè)Double-Checked Lock的討論有很多,,目前公認(rèn)這是一個(gè)Anti-Pattern,,不推薦使用,!所以當(dāng)你的面試官聽到你的這番答復(fù),他會(huì)不會(huì)被Hold住呢,?
     那么有沒有什么更好的寫法呢,?有!這里又要提出一種新的模式——Initialization on Demand Holder. 這種方法使用內(nèi)部類來做到延遲加載對象,,在初始化這個(gè)內(nèi)部類的時(shí)候,,JLS(Java Language Sepcification)會(huì)保證這個(gè)類的線程安全。這種寫法最大的美在于,,完全使用了Java虛擬機(jī)的機(jī)制進(jìn)行同步保證,,沒有一個(gè)同步的關(guān)鍵字。
  1. public class Singleton       
  2. {       
  3.     private static class SingletonHolder       
  4.     {       
  5.         public final static Singleton instance = new Singleton();       
  6.     }       
  7.       
  8.     public static Singleton getInstance()       
  9.     {       
  10.         return SingletonHolder.instance;       
  11.     }       
  12. }     

 


  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多