單例模式-實(shí)戰(zhàn)

單例模式:前面的一篇文章,曾經(jīng)對單例模式進(jìn)行了一個(gè)基本的認(rèn)知

今天通過代碼來一步步優(yōu)化單例模式

demo1?

demo2

所謂的懶漢式:就是使用時(shí)才會去創(chuàng)建;但是,該方式會有問題:如果在多線程情況下,會產(chǎn)生兩個(gè)對象

demo3

由demo3我們可以看到,通過synchronized加鎖方式,從多線程角度來看,Synchronized放到方法上會影響性能。于是我們不難想到將其放到方法里。

demo4

其實(shí)到了這一步,這種方式其實(shí)還是有問題的,當(dāng)線程1和2都執(zhí)行到了?if?(instance?==?null)的判斷語句(還未加鎖),這種情況最后也會產(chǎn)生兩個(gè)對象,于是,我們想到??鎖里面再加一個(gè)是否為空的判斷

demo5

這一步,我們實(shí)際是通過?double-checked locking (DCL) 來進(jìn)行控制 ;此時(shí),很多人都會覺得無懈可擊了;從多線程角度來看,這樣寫的單例確實(shí)沒有問題了,但從Java的類創(chuàng)建原理來看,可能還有問題;

從淺顯簡單的理解來看,就是對象還未完全創(chuàng)建出來,但instance變量已被賦值,此時(shí)另一個(gè)線程獲取實(shí)例時(shí),會得到instance,但它的堆空間及相關(guān)的方法還未完成時(shí),調(diào)用實(shí)例方法就會出錯(cuò)。

demo6

對象的創(chuàng)建過程,后期會專門進(jìn)行一次分享

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容