成人免费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

高并發線程安全

2025-06-26 00:40:13

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服務器

2021-07-26 06:57:59

Synchronize線程安全

2015-10-27 09:19:24

2023-03-21 09:07:38

HashMap線程安全

2021-11-15 10:35:46

Python線程代碼

2024-06-04 08:32:40

2022-03-09 09:43:01

工具類線程項目

2024-12-31 11:40:05

2019-12-20 15:19:41

Synchroinze線程安全

2017-12-06 16:28:48

Synchronize實現原理

2024-04-24 10:38:22

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天操网 | 射久久 | 91视频在线 | 欧美在线视频一区二区 | 国产精品久久久久久亚洲调教 | 中文字幕欧美日韩一区 | 亚洲视频在线观看 | 人人人干 | 久久噜噜噜精品国产亚洲综合 | 欧美一级久久 | 一区二区三区小视频 | 日日干日日操 | 欧洲一区在线观看 | 在线欧美一区 | 91视频播放| 亚洲三区视频 | 午夜在线影院 | 欧美激情啪啪 | 亚洲精品91 | 国产亚洲一区二区三区在线 | 黄网在线观看 | 久久久精品视频免费 | 国产成人综合一区二区三区 | 国产精品爱久久久久久久 | 欧美日韩精品免费 | av毛片| av三级在线观看 | 久草免费在线视频 | 免费在线成人网 | 天久久| 国产91网站在线观看 | 国产一级在线 | 欧美一级视频免费看 | caoporn国产精品免费公开 | 国产成在线观看免费视频 | 奇米四色影视 | 国产综合在线视频 | 欧美日韩不卡在线 | 欧美美女被c| 欧美在线a | 狠狠色狠狠色综合日日92 |