无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java多線程 8種單例模式總結(jié)

2020-09-07 08:01 作者:超人歸來thc  | 我要投稿

不同寫法對比

餓漢式: 寫法簡單, 但是沒有l(wèi)azy loading 懶加載
懶漢式: 如果寫的不好, 會有線程安全問題. 尤其是在判斷是否為空的地方
靜態(tài)內(nèi)部類: 可用 避免了線程安全問題和資源浪費(fèi)的問題.

雙重檢查模式: ?面試使用, 可以體現(xiàn)出很多的JMM知識 . ?同時(shí)做到了線程安全和懶加載

枚舉: 最好的寫法. 生產(chǎn)中使用.

為什么枚舉是最好的單例模式寫法

  1. 《Effective Java》 這本書的作者提到, 枚舉是單例模式的最佳寫法

  2. 枚舉的單例模式寫法簡單. 只需要?jiǎng)?chuàng)建一個(gè)枚舉類, 一行代碼創(chuàng)建實(shí)例就行了.

  3. 線程安全有保障: 由于枚舉是特殊的類, 不需要程序員去保障線程安全, 枚舉反編譯后, 是成為了一個(gè)final修飾的類, 并且繼承了枚舉這個(gè)父類, 并且這個(gè)父類中的實(shí)例, 都是通過static定義的, 所以枚舉的本質(zhì)就是一個(gè)靜態(tài)的對象, 那么第一次使用到枚舉的時(shí)候, 才會被加載, 有懶加載的優(yōu)點(diǎn).

  4. 避免反序列化破壞單例: ?其他單例模式的寫法, 可能會被反射的寫法所破壞. 比如通過反射會把私有的構(gòu)造方法給繞過去, 或者反序列化也會反序列化出多個(gè)實(shí)例. 此時(shí),如果使用枚舉, 就避免了安全問題,防止反序列化創(chuàng)新創(chuàng)建新的對象. ?

使用的注意事項(xiàng)

  1. 枚舉最好用

  2. 非線程同步的方法不能使用

  3. 如果程序一開始加載的資源多, 那么就應(yīng)該使用懶加載

  4. 餓漢式的寫法, ?如果對象的創(chuàng)建需要配置文件或數(shù)據(jù)庫中的數(shù)據(jù)就不適用. ?因?yàn)橐婚_始就實(shí)例好了一些對象, 但是還沒加載好數(shù)據(jù), 實(shí)際還是不可用的, 應(yīng)該用懶漢式的懶加載

  5. 懶加載雖然好, 但是靜態(tài)內(nèi)部類這種方式會引入編程的復(fù)雜性.

單例模式面試問題

  1. 餓漢式的缺點(diǎn)
    類一加載的時(shí)候,就創(chuàng)建了實(shí)例, 如果不需要這個(gè)實(shí)例, 就造成了浪費(fèi),

  2. 懶漢式的缺點(diǎn)?
    雖然解決了前期加載資源浪費(fèi)的問題, 只在需要的時(shí)候才加載 . 但是寫法比較的復(fù)雜. 會有可能寫成了線程不安全的情況.

  3. 為什么要用雙重檢查? 不用就不安全嗎
    單個(gè)檢查, 線程不安全, 兩個(gè)線程可能同時(shí)進(jìn)入單個(gè)檢查的代碼中, 造成創(chuàng)建了兩個(gè)實(shí)例對象. 雙重檢查做到了懶加載和線程安全. ?如果不用雙重鎖,把synchronized加在方法上,線程是安全的 , 那么造成性能的下降,

  4. 雙重檢查為什么要加volatile?
    因?yàn)闃?gòu)造單例模式, 創(chuàng)建實(shí)例對象的時(shí)候, 代表了三個(gè)步驟, 分別是創(chuàng)建一個(gè)空對象, 調(diào)用構(gòu)造方法 , 最后是把實(shí)例的地址, 分配給引用. 但是這三個(gè)步驟順序是不能保證的, 一旦調(diào)用構(gòu)造方法這一步是最后一步了, 那么很有可能分配給引用的對象, 造成空指針的異常, 這樣就造成了線程安全問題,加了volatile就避免了重排序, ?并且加上了volatile, 第一個(gè)線程創(chuàng)建的單例的實(shí)例對象, 對于第二個(gè)線程也是可見的, 保證了可見性.

  5. 應(yīng)該選擇哪種單例模式的寫法最好?
    用枚舉的寫法最好, 因?yàn)閷懛ê唵? 線程安全, 還能防止反序列化破壞單例.?


Java多線程 8種單例模式總結(jié)的評論 (共 條)

分享到微博請遵守國家法律
桦甸市| 嘉兴市| 大方县| 彭泽县| 沾益县| 泗洪县| 尼木县| 涞源县| 武冈市| 庆云县| 黔西县| 澄迈县| 天峻县| 宁陵县| 南充市| 台东市| 建湖县| 安宁市| 沙雅县| 叶城县| 轮台县| 石柱| 玉屏| 元阳县| 佛坪县| 枣强县| 额济纳旗| 连云港市| 奇台县| 文山县| 抚松县| 抚顺市| 南昌市| 长沙县| 长沙市| 土默特左旗| 文山县| 石林| 旌德县| 铁岭县| 望都县|