溫馨提示×

懶漢式與餓漢式單例類區(qū)別

小樊
87
2024-09-09 10:47:11
欄目: 編程語言

懶漢式與餓漢式單例類的區(qū)別主要體現(xiàn)在實例化時機、線程安全性和資源利用效率上。以下是詳細介紹:

實例化時機

  • 餓漢式:在類加載時就完成了實例化,因此實例化速度快,但無論是否使用該實例,都會占用內(nèi)存資源。
  • 懶漢式:在第一次調(diào)用getInstance()方法時才進行實例化,實現(xiàn)了延遲加載,可以有效減少資源浪費。

線程安全性

  • 餓漢式:由于實例化在類加載時已經(jīng)完成,因此天然是線程安全的,不存在多線程同時創(chuàng)建實例的問題。
  • 懶漢式:在多線程環(huán)境下,如果不進行適當?shù)耐?,可能會導致多個線程同時創(chuàng)建實例,從而違反單例原則。懶漢式可以通過在getInstance()方法上加synchronized關鍵字或使用雙重檢查鎖定(Double-Checked Locking)來確保線程安全。

資源利用效率

  • 餓漢式:由于實例化在類加載時完成,無論是否使用該實例,都會占用內(nèi)存資源,這在資源利用上可能不夠經(jīng)濟。
  • 懶漢式:只有在需要時才創(chuàng)建實例,可以有效減少資源浪費,提高資源利用效率。

示例代碼

  • 餓漢式示例代碼(Java):
public class HungryStyle {
    private static final HungryStyle instance = new HungryStyle();

    private HungryStyle() {}

    public static HungryStyle getInstance() {
        return instance;
    }
}
  • 懶漢式示例代碼(Java,線程安全):
public class LazyStyle {
    private static LazyStyle instance;

    private LazyStyle() {}

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

綜上所述,懶漢式單例類在實例化時機、線程安全性和資源利用效率方面與餓漢式單例類有所不同。懶漢式單例類通過延遲加載實例化對象,提高了資源利用效率,但需要注意線程安全問題。餓漢式單例類則在實例化時就已經(jīng)完成了對象的創(chuàng)建,線程安全,但可能會造成一定的資源浪費。

0