最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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é)的評論 (共 條)

分享到微博請遵守國家法律
乾安县| 宁夏| 丹江口市| 肥东县| 云梦县| 呈贡县| 淮北市| 大连市| 浑源县| 航空| 山阳县| 错那县| 宜州市| 云梦县| 新疆| 渝中区| 延津县| 嘉荫县| 岚皋县| 恩平市| 德兴市| 苗栗县| 驻马店市| 阿拉善左旗| 来凤县| 密山市| 西乌| 兴国县| 察隅县| 休宁县| 达州市| 汨罗市| 石家庄市| 平江县| 循化| 南平市| 清新县| 阿瓦提县| 五河县| 延吉市| 沁水县|