想必很多朋友在java中都使用過單例模式,在網上搜索的時候也都查到過各種單例模式的實現,比如我之前寫的一篇博客:單例模式的7種實現方式及分析(https://blog.csdn.net/xyc_csdn/article/details/78165948),在這些博客中基本都會提到一個詞,就是“懶加載”,但是也沒有具體解釋,讓人感到頭大。
但是當你細想的時候你就會發現有些不對勁,因爲JVM加載一個類的時候本來就是懶加載的,哪怕你使用餓漢模式實現一個單例,代碼如下:
package com.xiayc.singleton;
/**
* 餓漢模式
*/
public class Hungry {
private Hungry() {
}
private volatile static Hungry singleton = new Hungry();
public static Hungry getSingleton() {
return singleton;
}
}
靜態變量singleton 也是要等到你代碼中調用Hungry的getSingleton方法時纔會去初始化,而不是你的項目啓動起來之後就已經把靜態變量singleton初始化了!
所以爲什麼java中的單例模式需要懶加載?還是上面的理由,當你顯示去調用Hungry的靜態方法或者靜態變量/常量(構造方法爲private,無法new)時這個類纔會進行初始化,理想情況下,你的單例類Hungry 只對外提供getSingleton方法,那麼你就無需考慮懶加載的問題,但是如果你的單例類可能還提供了其它外部可以調用的靜態方法或者靜態變量/常量時,你還是把單例的懶加載交給你自己處理比較好!
所以綜合來看,在java中單例模式的懶加載還是你自己實現比較好,做好自己就行,就是後面代碼變了,你的懶加載還是懶加載!
如有不足之處,可以在評論區留言,期待各位的斧正,謝謝!!!