App下載

Java單例模式的餓漢式與懶漢式實現(xiàn)比較

一顆跳動的心 2023-07-23 09:30:00 瀏覽數(shù) (2800)
反饋

在Java中,單例模式是一種常用的設(shè)計模式,用于確保一個類只有一個實例,并提供一個全局訪問點。餓漢式和懶漢式是單例模式的兩種實現(xiàn)方式。本文將詳細介紹Java單例模式的餓漢式和懶漢式實現(xiàn),并比較它們之間的優(yōu)缺點。

餓漢式實現(xiàn)

 餓漢式是在類加載時就創(chuàng)建唯一實例,并在類內(nèi)部進行實例化。它的實現(xiàn)非常簡單,通過私有化構(gòu)造方法和靜態(tài)成員變量來確保只有一個實例。示例代碼:

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {
        // 私有構(gòu)造函數(shù),防止外部實例化
    }

    public static EagerSingleton getInstance() {
        return instance;
    }
}

優(yōu)點:

  • 線程安全:在類加載時就創(chuàng)建了實例,不需要考慮線程安全問題。
  • 簡單明了:實現(xiàn)簡單,代碼易于理解。

缺點:

  • 立即加載:類加載時即創(chuàng)建實例,可能會浪費資源。
  • 不支持延遲加載:如果實例的創(chuàng)建過程較為耗時,可能會導(dǎo)致程序啟動變慢。

懶漢式實現(xiàn)

懶漢式是在第一次使用時才進行實例化,實現(xiàn)了延遲加載的效果。在多線程環(huán)境下需要考慮線程安全問題。示例代碼:

public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {
        // 私有構(gòu)造函數(shù),防止外部實例化
    }

    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

優(yōu)點:

  • 延遲加載:在第一次使用時才創(chuàng)建實例,節(jié)省了資源。
  • 線程安全:使用synchronized關(guān)鍵字確保線程安全。

缺點:

  • 性能影響:由于使用了synchronized,可能會導(dǎo)致性能下降,特別是在高并發(fā)環(huán)境下。
  • 可能存在重復(fù)創(chuàng)建實例:在多線程環(huán)境下,可能出現(xiàn)多個線程同時判斷instance為空的情況,從而重復(fù)創(chuàng)建實例。

如何選擇

如果希望在程序啟動時就創(chuàng)建實例,并且沒有性能要求,可以選擇餓漢式實現(xiàn)。

如果希望延遲加載實例,并且要考慮線程安全問題,可以選擇懶漢式實現(xiàn)。

結(jié)語

Java單例模式的餓漢式和懶漢式是常用的兩種實現(xiàn)方式。餓漢式在類加載時就創(chuàng)建實例,線程安全且簡單明了;懶漢式在第一次使用時才創(chuàng)建實例,具有延遲加載的特點,但需要考慮線程安全和性能問題。在實際開發(fā)中,根據(jù)需求和場景合理選擇合適的實現(xiàn)方式,能夠確保對象的唯一性和全局訪問性。

 學(xué)java,就到java編程獅

0 人點贊