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

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

引用一段網上對這兩種模式的介紹:

“餓漢模式的特點是加載類時比較慢,但運行時獲取對象的速度比較快,線程安全。餓漢式是線程安全的,在類創(chuàng)建的同時就已經創(chuàng)建好一個靜態(tài)的對象供系統(tǒng)使用,以后不在改變。懶漢模式的特點是加載類時比較快,但是在運行時獲取對象的速度比較慢,線程不安全, 懶漢式如果在創(chuàng)建實例對象時不加上synchronized則會導致對象的訪問不是線程安全的。所以在此推薦大家使用餓漢模式。”

筆者先給出結論“上面這段描述可以說是完全不正確,最后給出的結論還算勉強正確,為什么說勉強正確,因為我不會推薦大家使用餓漢模式,我會直接說就用餓漢模式,懶漢模式在任何情況下都不需要”。

網上這段文字的錯誤主要有兩點

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

  2. 餓漢模式在加載類時會慢

先來看一下懶漢模式,不用synchronized也能實現線程安全

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

懶漢模式V1.0:

延伸閱讀

學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網站設計培訓,網站建設培訓學習是年輕人改變自己的最好方式