單例模式:前面的一篇文章,曾經(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)行一次分享