一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

java線程安全的單例模式

 騰飛工作室 2014-02-15

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

  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. }     


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


這種寫法就是所謂的懶漢模式。它使用了延遲加載來保證對象在沒有使用之前,是不會進行初始化的。但是,通常這個時候面試官又會提問新的問題來刁難一下。他會問:這種寫法線程安全嗎?回答必然是:不安全。這是因為在多個線程可能同時運行到第九行,判斷singObj為null,于是同時進行了初始化。所以,這是面臨的問題是如何使得這個代碼線程安全?很簡單,在那個方法前面加一個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. }     

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

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

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

 


  

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    又黄又爽禁片视频在线观看| 欧美一区二区三区高潮菊竹| 超碰在线免费公开中国黄片| 毛片在线观看免费日韩| 黄男女激情一区二区三区| 欧美大黄片在线免费观看| 国产午夜精品在线免费看| 久久99午夜福利视频| 欧美国产日韩在线综合| 中文字幕一区二区免费| 中文字幕熟女人妻视频| 亚洲欧美日本国产不卡| 欧美日本精品视频在线观看| 免费在线播放一区二区| 亚洲中文字幕人妻av| 国产中文字幕一二三区| 欧美激情中文字幕综合八区| 国产精品午夜视频免费观看| 日本大学生精油按摩在线观看| 亚洲一区二区精品免费| 我要看日本黄色小视频| 国产又粗又深又猛又爽又黄| 国产一区一一一区麻豆| 日本二区三区在线播放| 日本少妇中文字幕不卡视频| 国产成人精品一区二区在线看| av在线免费观看一区二区三区| 人妻亚洲一区二区三区| 亚洲国产av在线观看一区| 91亚洲人人在字幕国产| 激情中文字幕在线观看| 亚洲国产欧美久久精品| 色婷婷国产精品视频一区二区保健| 日韩一区二区三区有码| 91人妻人澡人人爽人人精品| 亚洲国产av精品一区二区| 韩日黄片在线免费观看| 91亚洲国产日韩在线| 日韩精品在线观看一区| 日本福利写真在线观看| 九九热国产这里只有精品|