一、懶漢式(Lazy Initialization)
懶漢式是指在需要調用時才去創建單例對象,而不是在程序運行時就創建好,以達到延遲載入的效果。
1、優點
懶漢式可以避免在程序啟動時就創建單例對象,從而降低系統的開銷。如果單例對象很大或者需要一定時間才能創建,那麼懶漢式會比較有優勢。
2、缺點
懶漢式也有一些缺點。首先,多線程環境下,需要使用同步鎖來保證線程安全,這會導致性能下降。其次,如果有多個類載入器,那麼會存在不同類載入器載入了不同的單例對象的情況。
3、代碼實現
public class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static synchronized LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
二、餓漢式(Eager Initialization)
餓漢式是指在程序運行時就創建好單例對象,並且在整個程序周期內都會存在。
1、優點
餓漢式可以避免多線程環境下的同步問題,因為單例對象在程序運行時就已經創建好了。同時在單例對象很小且不需要延遲載入的情況下,使用餓漢式也比較合適。
2、缺點
餓漢式也有一些缺點。首先,如果單例對象比較大,那麼在程序啟動時就會佔用較多的內存空間。其次,如果單例對象的初始化需要很長的時間,那麼程序啟動時的等待時間會變長。
3、代碼實現
public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } }
三、懶漢式與餓漢式的比較
1、線程安全
懶漢式需要使用同步鎖來保證線程安全,而餓漢式本身就是線程安全的。
2、是否延遲載入
懶漢式是延遲載入的,而餓漢式是立即載入的。
3、系統開銷
懶漢式可以避免在程序啟動時就創建單例對象,從而降低系統的開銷。而餓漢式會在程序啟動時就創建單例對象,如果單例對象很大或需要一定時間才能創建,那麼會造成一定的系統開銷。
4、不同類載入器載入的問題
如果有多個類載入器,那麼懶漢式會存在不同類載入器載入了不同的單例對象的情況。而餓漢式不存在這個問題。
原創文章,作者:CPNGR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/367936.html