Java設(shè)計(jì)模式中,懶漢和餓漢是兩種常見的單例模式實(shí)現(xiàn)方式,它們的主要區(qū)別在于創(chuàng)建對象的時機(jī)不同。
餓漢模式是在類加載時就已經(jīng)創(chuàng)建了單例對象,并且提供了一個公共的訪問方法。這樣可以保證在多線程環(huán)境下,任何時候都只有一個實(shí)例對象在被訪問。
public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } }
懶漢模式則是在首次訪問時才會創(chuàng)建單例對象。這種方式可能造成線程不安全的問題,因此需要使用雙重檢查鎖或靜態(tài)內(nèi)部類等方式保證線程安全。
public class LazySingleton { private volatile static LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { if (instance == null) { synchronized (LazySingleton.class) { if (instance == null) { instance = new LazySingleton(); } } } return instance; } }
總體來說,餓漢模式適合對象實(shí)例化時間短、消耗資源小的情況,而懶漢模式適合對象實(shí)例化時間長、消耗資源大的情況。在具體應(yīng)用中,需要根據(jù)實(shí)際情況選擇合適的單例模式實(shí)現(xiàn)方式。