天天看點

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

和你了解的線程安全的單列模式絕對不一樣

  • 普通(線程不安全)的懶漢式和餓漢式
    • 接下來看看你了解的線程安全的單例模式
    • 咱們繼續更新
    • 接下來就是重頭戲了,看好了

普通(線程不安全)的懶漢式和餓漢式

直接上代碼:

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式
和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

這個不安全就不用我說了吧

接下來看看你了解的線程安全的單例模式

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

接下來來看看我怎麼破解這個線程安全的單例模式

1,首先咱們先看看用方法建立對象是不是安全的

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

可以看到傳回true說明是安全的

再用反射來攻擊它

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

看到沒 ! 看到沒!! 我厲害吧!

咱們繼續更新

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

這個我可能要跟大家解釋一下了,首先有一個volatile這個字段,然後還加了synchronized這個鎖 。

volatile:我就知道是防止指令重排,你們去百度一下,我也說不清楚。(其實我也不是很了解,嘿嘿)

到這裡先别往下看,你們覺得這個會出現線程安全問題嘛。(自己猜一猜)

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

看到沒 !!看到沒 !! 還有誰我就問,還有誰。

這時我們應該思考一下了,如果連這樣都不能實作線程安全的單例模式,還能怎麼實作。而且誰發明的這個反射媽蛋,沒有反射該多好,是不是。其實除了反射以外,還有一種序列化攻擊也能出現線程安全問題。

欸,還是給你們看看吧。本來不想給你們看的,你們都學會了,我就很難受了。

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

看到沒 ,我牛皮不? 我就問,還有誰。

接下來就是重頭戲了,看好了

咱們先建立一個枚舉類,别眨眼

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

然後我們用反射攻擊它

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

欸,怎麼報錯了???不可能啊,然後,經過我深思熟慮,穿過喜馬拉雅山,登上最高峰,我突然頓悟了,

代碼沒問題,它本來就是這樣滴,隻要反射攻擊枚舉類型就會這樣滴,小夥伴們我叼不叼,等下記得誇一下

我,

咱們再來看看序列化攻擊的情況,别眨眼

和你了解的線程安全的單列模式絕對不一樣普通(線程不安全)的懶漢式和餓漢式

看到沒,看到沒。我特麼,天才。不說了,就這樣。去裝逼去了。

第一次寫部落格不會用,你們将就看,感覺這樣對你們也好,你們至少可以手寫,好好加油哈。