單例中懶漢和餓漢的本質區別

2021-09-08 01:25:16 字數 1126 閱讀 4222

單例中懶漢和餓漢的本質區別在於以下幾點:

1、餓漢式是執行緒安全的,在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不在改變。懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的。

2、從實現方式來講他們最大的區別就是懶漢式是延時載入,他是在需要的時候才建立物件,而餓漢式在虛擬機器啟動的時候就會建立,餓漢式無需關注多執行緒問題、寫法簡單明瞭、能用則用。但是它是載入類時建立例項、所以如果是乙個工廠模式、快取了很多例項、那麼就得考慮效率問題,因為這個類一載入則把所有例項不管用不用一塊建立。

兩種實現方式:

1  懶漢模式(類載入時不初始化)

package singleton;

public class lazysingleton

public static synchronized lazysingleton getinstance() //靜態,同步,公開訪問點

return intance;

}}

關鍵點:(**注釋上已給出)

1)建構函式定義為私有----不能在別的類中來獲取該類的物件,只能在類自身中得到自己的物件

2)成員變數為static的,沒有初始化----類載入快,但訪問類的唯一例項慢,static保證在自身類中獲取自身物件

3)公開訪問點getinstance: public和synchronized的-----public保證對外公開,同步保證多執行緒時的正確性(因為類變數不是在載入時初始化的)

優缺點見**注釋。

2  餓漢式單例模式(在類載入時就完成了初始化,所以類載入較慢,但獲取物件的速度快)

package singleton;

public class eagersingleton

public static eagersingleton getinstance() //靜態,不用同步(類載入時已初始化,不會有多執行緒的問題)

}

關鍵點:(**注釋已寫)

1)私有建構函式

2)靜態私有成員--在類載入時已初始化

3)公開訪問點getinstance-----不需要同步,因為在類載入時已經初始化完畢,也不需要判斷null,直接返回

優缺點見**注釋。

懶漢和餓漢單例的區別

首先來看餓漢單例模式 public class eagersingleton private static eagersingleton instance new eagersingleton 餓漢式在類被建立的時候就建立例項 public static eagersingleton getinst...

單例中的懶漢與餓漢

首先對單例模式的懶漢式與餓漢式進行簡單介紹 1 餓漢式 在程式啟動或單件模式類被載入的時候,單件模式例項就已經被建立。2 懶漢式 當程式第一次訪問單件模式例項時才進行建立。如何選擇 如果單件模式例項在系統中經常會被用到,餓漢式是乙個不錯的選擇。反之如果單件模式在系統中會很少用到或者幾乎不會用到,那麼...

單例模式的餓漢和懶漢

單例模式就是要確保類在記憶體中只有乙個物件,該例項必須自動建立類,並且對外提供。優點 在系統記憶體中只存在乙個物件,一次可以節約系統資源,對於一些需要頻繁建立和銷毀的物件單例模式無疑可以提高系統的效能。缺點 1.沒有抽象層,因此擴充套件很難。2.指責過重,在一定程式上違背了單一職責。餓漢式和懶漢式的...