最近在看jvm,發(fā)現隨著自己對jvm底層的了解,現在對java代碼可以說是有了全新的認識。今天就從jvm的角度來看一看以前自以為很了解的單例模式。
了解單例模式的人都知道,單例模式有兩種:“餓漢模式”和“懶漢模式”。
引用一段網上對這兩種模式的介紹:
“餓漢模式的特點是加載類時比較慢,但運行時獲取對象的速度比較快,線程安全。餓漢式是線程安全的,在類創(chuàng)建的同時就已經創(chuàng)建好一個靜態(tài)的對象供系統(tǒng)使用,以后不在改變。懶漢模式的特點是加載類時比較快,但是在運行時獲取對象的速度比較慢,線程不安全, 懶漢式如果在創(chuàng)建實例對象時不加上synchronized則會導致對象的訪問不是線程安全的。所以在此推薦大家使用餓漢模式。”
筆者先給出結論“上面這段描述可以說是完全不正確,最后給出的結論還算勉強正確,為什么說勉強正確,因為我不會推薦大家使用餓漢模式,我會直接說就用餓漢模式,懶漢模式在任何情況下都不需要”。
網上這段文字的錯誤主要有兩點
懶漢模式線程不安全,如果想線程安全必須加synchronized
餓漢模式在加載類時會慢
先來看一下懶漢模式,不用synchronized也能實現線程安全
先來回顧一下懶漢模式的“發(fā)展史”
懶漢模式V1.0:
延伸閱讀
學習是年輕人改變自己的最好方式