在Java開發中,單例模式是常見的一種設計模式,它可以保證一個類只有一個實例,并且提供了一個全局的訪問點。在單例模式中,懶漢式和餓漢式是兩種常見的實現方式。
懶漢式
public class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static synchronized LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
懶漢式是在第一次使用時才會實例化對象,它的優點是節省了內存空間,但缺點是可能存在線程安全問題。在多線程的情況下,可能會出現多個線程同時訪問getInstance()方法,導致重復實例化對象。
餓漢式
public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } }
餓漢式是在類加載時就已經實例化對象,它的優點是不存在線程安全問題,但缺點是可能造成內存浪費。如果該對象很長時間內沒有被使用,那么就會一直占據內存空間。
因此,選擇懶漢式還是餓漢式需要根據具體的情況進行考慮,鑒于懶漢式可能存在線程安全問題,可以采用雙重檢驗鎖的方式來保證線程安全,代碼如下:
public class DoubleCheckSingleton { private volatile static DoubleCheckSingleton instance; private DoubleCheckSingleton() {} public static DoubleCheckSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckSingleton.class) { if (instance == null) { instance = new DoubleCheckSingleton(); } } } return instance; } }
雙重檢驗鎖模式可以在保證線程安全的同時,盡可能地減少了鎖的使用,提高了性能。