成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不使用synchronized和lock,如何實現一個線程安全的單例?

安全 應用安全
從后往前說,先說兩個餓漢,其實都是通過定義靜態的成員變量,以保證instance可以在類初始化的時候被實例化。那為啥讓instance在類初始化的時候被實例化就能保證線程安全了呢?因為類的初始化是由ClassLoader完成的,這其實就是利用了ClassLoader的線程安全機制啊。

 [[203863]]

不使用synchronized和lock,如何實現一個線程安全的單例?

回答最多的是靜態內部類和枚舉。很好,這兩種確實可以實現。

枚舉

  1. public enum Singleton {   
  2.     INSTANCE;   
  3.     public void whateverMethod() {   
  4.     }   
  5. }   

靜態內部類

  1. public class Singleton {   
  2.     private static class SingletonHolder {   
  3.     private static final Singleton INSTANCE = new Singleton();   
  4.     }   
  5.     private Singleton (){}   
  6.     public static final Singleton getInstance() {   
  7.     return SingletonHolder.INSTANCE;   
  8.     }   
  9. }   

還有人回答的很簡單:餓漢。很好,這個也是對的。

餓漢

  1. public class Singleton {   
  2.     private static Singleton instance = new Singleton();   
  3.     private Singleton (){}   
  4.     public static Singleton getInstance() {   
  5.     return instance;   
  6.     }   
  7. }   

餓漢變種

  1. public class Singleton {   
  2.     private static class SingletonHolder {   
  3.     private static final Singleton INSTANCE = new Singleton();   
  4.     }   
  5.     private Singleton (){}   
  6.     public static final Singleton getInstance() {   
  7.     return SingletonHolder.INSTANCE;   
  8.     }   
  9. }   

(更多單例實現方式見:單例模式的七種寫法)

問:這幾種實現單例的方式的真正的原理是什么呢?

答:以上幾種實現方式,都是借助了ClassLoader的線程安全機制。

先解釋清楚為什么說都是借助了ClassLoader。

從后往前說,先說兩個餓漢,其實都是通過定義靜態的成員變量,以保證instance可以在類初始化的時候被實例化。那為啥讓instance在類初始化的時候被實例化就能保證線程安全了呢?因為類的初始化是由ClassLoader完成的,這其實就是利用了ClassLoader的線程安全機制啊。

再說靜態內部類,這種方式和兩種餓漢方式只有細微差別,只是做法上稍微優雅一點。這種方式是Singleton類被裝載了,instance不一定被初始化。因為SingletonHolder類沒有被主動使用,只有顯示通過調用getInstance方法時,才會顯示裝載SingletonHolder類,從而實例化instance。。。但是,原理和餓漢一樣。

***說枚舉,其實,如果把枚舉類進行反序列化,你會發現他也是使用了static final來修飾每一個枚舉項。(詳情見:深度分析Java的枚舉類型—-枚舉的線程安全性及序列化問題)

至此,我們說清楚了,各位看官的回答都是利用了ClassLoader的線程安全機制。至于為什么ClassLoader加載類是線程安全的,這里可以先直接回答:ClassLoader的loadClass方法在加載類的時候使用了synchronized關鍵字。也正是因為這樣, 除非被重寫,這個方法默認在整個裝載過程中都是同步的(線程安全的)。(詳情見:深度分析Java的ClassLoader機制(源碼級別))

哈哈哈哈!!!~所以呢,這里可以說,大家的回答都只答對了一半。雖然沒有顯示使用synchronized和lock,但是還是間接的用到了!!!!

那么,這里再問一句:不使用synchronized和lock,如何實現一個線程安全的單例?

【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-09-18 09:17:07

線程安全單例

2024-11-26 07:29:57

高并發線程安全

2021-02-07 23:58:10

單例模式對象

2021-03-15 07:02:02

java線程安全

2024-02-22 10:02:03

單例模式系統代碼

2021-04-15 09:18:22

單例餓漢式枚舉

2020-10-10 10:20:11

云計算云安全技術

2014-06-26 09:36:02

Angular評論應用

2023-03-30 13:22:45

nginxweb服務器

2023-03-21 09:07:38

HashMap線程安全

2015-10-27 09:19:24

2022-03-09 09:43:01

工具類線程項目

2021-07-26 06:57:59

Synchronize線程安全

2021-11-15 10:35:46

Python線程代碼

2024-06-04 08:32:40

2024-12-31 11:40:05

2017-12-06 16:28:48

Synchronize實現原理

2024-04-24 10:38:22

2019-12-20 15:19:41

Synchroinze線程安全

2013-03-04 16:45:49

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧洲精品成人久久奇米网 | 成人免费淫片aa视频免费 | 欧美一区2区三区4区公司二百 | 国产高清精品在线 | www.亚洲 | 成人二区三区 | 欧美精品一区在线发布 | 色综合视频 | 91亚洲精品国偷拍自产在线观看 | 中文字幕视频在线 | 中文字幕在线剧情 | 亚洲图片一区二区三区 | 欧美一区二区三区四区五区无卡码 | 亚洲视频一区 | 久久亚洲国产精品日日av夜夜 | 国产精品一区二区久久久久 | 欧美日韩在线一区二区 | 国产精品一区二区三区四区五区 | 狠狠干美女 | av影音资源 | 日本黄色影片在线观看 | 久久精品成人 | 天堂一区二区三区 | 精品一区精品二区 | 九九久久精品 | 国产精品一卡 | 久久久91精品国产一区二区三区 | 日韩av成人在线 | 国产精品一区二区三区在线 | 在线观看免费黄色片 | 一区二区三区中文字幕 | 亚洲三区视频 | 欧美一区视频 | 久久久亚洲综合 | 久久国产精品久久久久久久久久 | 乱码av午夜噜噜噜噜动漫 | 久久国产一区二区 | 成人免费大片黄在线播放 | 91视频进入 | 日韩成人免费av | 日韩一区二区福利 |