自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不使用synchronized和lock,如何實(shí)現(xiàn)一個線程安全的單例?

安全 應(yīng)用安全
從后往前說,先說兩個餓漢,其實(shí)都是通過定義靜態(tài)的成員變量,以保證instance可以在類初始化的時候被實(shí)例化。那為啥讓instance在類初始化的時候被實(shí)例化就能保證線程安全了呢?因?yàn)轭惖某跏蓟怯蒀lassLoader完成的,這其實(shí)就是利用了ClassLoader的線程安全機(jī)制啊。

 [[203863]]

不使用synchronized和lock,如何實(shí)現(xiàn)一個線程安全的單例?

回答最多的是靜態(tài)內(nèi)部類和枚舉。很好,這兩種確實(shí)可以實(shí)現(xiàn)。

枚舉

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

靜態(tài)內(nèi)部類

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

(更多單例實(shí)現(xiàn)方式見:單例模式的七種寫法)

問:這幾種實(shí)現(xiàn)單例的方式的真正的原理是什么呢?

答:以上幾種實(shí)現(xiàn)方式,都是借助了ClassLoader的線程安全機(jī)制。

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

從后往前說,先說兩個餓漢,其實(shí)都是通過定義靜態(tài)的成員變量,以保證instance可以在類初始化的時候被實(shí)例化。那為啥讓instance在類初始化的時候被實(shí)例化就能保證線程安全了呢?因?yàn)轭惖某跏蓟怯蒀lassLoader完成的,這其實(shí)就是利用了ClassLoader的線程安全機(jī)制啊。

再說靜態(tài)內(nèi)部類,這種方式和兩種餓漢方式只有細(xì)微差別,只是做法上稍微優(yōu)雅一點(diǎn)。這種方式是Singleton類被裝載了,instance不一定被初始化。因?yàn)镾ingletonHolder類沒有被主動使用,只有顯示通過調(diào)用getInstance方法時,才會顯示裝載SingletonHolder類,從而實(shí)例化instance。。。但是,原理和餓漢一樣。

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

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

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

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

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

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

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2017-09-18 09:17:07

線程安全單例

2024-11-26 07:29:57

高并發(fā)線程安全

2021-02-07 23:58:10

單例模式對象

2024-02-22 10:02:03

單例模式系統(tǒng)代碼

2021-04-15 09:18:22

單例餓漢式枚舉

2014-06-26 09:36:02

Angular評論應(yīng)用

2021-03-15 07:02:02

java線程安全

2020-10-10 10:20:11

云計(jì)算云安全技術(shù)

2023-03-30 13:22:45

nginxweb服務(wù)器

2015-10-27 09:19:24

2022-03-09 09:43:01

工具類線程項(xiàng)目

2021-11-15 10:35:46

Python線程代碼

2021-07-26 06:57:59

Synchronize線程安全

2023-03-21 09:07:38

HashMap線程安全

2017-12-06 16:28:48

Synchronize實(shí)現(xiàn)原理

2024-06-04 08:32:40

2024-12-31 11:40:05

2024-02-26 07:36:09

lockJava語言

2024-04-24 10:38:22

2023-07-18 15:49:22

HTMLCSS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號