最近在看jvm,發(fā)現(xiàn)隨著自己對(duì)jvm底層的了解,現(xiàn)在對(duì)java代碼可以說是有了全新的認(rèn)識(shí)。今天就從jvm的角度來看一看以前自以為很了解的單例模式。

了解單例模式的人都知道,單例模式有兩種:“餓漢模式”和“懶漢模式”。

引用一段網(wǎng)上對(duì)這兩種模式的介紹:

“餓漢模式的特點(diǎn)是加載類時(shí)比較慢,但運(yùn)行時(shí)獲取對(duì)象的速度比較快,線程安全。餓漢式是線程安全的,在類創(chuàng)建的同時(shí)就已經(jīng)創(chuàng)建好一個(gè)靜態(tài)的對(duì)象供系統(tǒng)使用,以后不在改變。懶漢模式的特點(diǎn)是加載類時(shí)比較快,但是在運(yùn)行時(shí)獲取對(duì)象的速度比較慢,線程不安全, 懶漢式如果在創(chuàng)建實(shí)例對(duì)象時(shí)不加上synchronized則會(huì)導(dǎo)致對(duì)象的訪問不是線程安全的。所以在此推薦大家使用餓漢模式?!?/p>

筆者先給出結(jié)論“上面這段描述可以說是完全不正確,最后給出的結(jié)論還算勉強(qiáng)正確,為什么說勉強(qiáng)正確,因?yàn)槲也粫?huì)推薦大家使用餓漢模式,我會(huì)直接說就用餓漢模式,懶漢模式在任何情況下都不需要”。

網(wǎng)上這段文字的錯(cuò)誤主要有兩點(diǎn)

  1. 懶漢模式線程不安全,如果想線程安全必須加synchronized

  2. 餓漢模式在加載類時(shí)會(huì)慢

先來看一下懶漢模式,不用synchronized也能實(shí)現(xiàn)線程安全

先來回顧一下懶漢模式的“發(fā)展史”

懶漢模式V1.0:

網(wǎng)友評(píng)論