App下載

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

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

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

餓漢式實(shí)現(xiàn)

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

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

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

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

優(yōu)點(diǎn):

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

缺點(diǎn):

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

懶漢式實(shí)現(xiàn)

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

public class LazySingleton {
    private static LazySingleton instance;

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

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

優(yōu)點(diǎn):

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

缺點(diǎn):

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

如何選擇

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

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

結(jié)語

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

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

0 人點(diǎn)贊