理解設計模式 單例模式

2021-09-19 15:33:28 字數 1421 閱讀 1405

定義: 確保要建立的類只有乙個例項

對於頻繁建立的物件,可以省略其建立時間,同時可以減輕gc的壓力

避免對共享資源的多重占用

使用場景:

單例模式寫法很多,這裡列舉以下三種:

1) 最簡單的寫法:使用列舉物件

public

enum singletonenum

使用列舉還可以避免反射獲取類的私有構造方法從而建立不同的物件

2)懶漢模式

public

class

singleton

//防止重排序

private

static

volatile singleton singleton = null;

public

static singleton getsingleton()

}}return singleton;

}}

注意點:

構造方法私有。在其他方法中就不可以建立該類物件,只能使用本類的靜態方法

雙重檢查模式。

如果不使用第二個判斷為null,那麼假設有兩個執行緒a和b,a執行緒拿到鎖,進入同步**塊,在建立物件之前b執行緒通過了第乙個判斷,當a執行緒執行結束,b執行緒會進入同步**塊,接著建立物件。

volatile關鍵字的使用,防止重排序。

new物件過程:

step1:在堆上分配記憶體空間

step2: 物件初始化

step3: 將棧上的物件引用指向堆物件

不加volatile可能會造成先執行1,3,這樣會造成a執行緒在完成1,3時,b執行緒來建立物件,發現singleton != null,直接將未初始化的物件返回。

3)使用靜態內部類

public

class

singleton_sta

static

class

factory

//呼叫該方法的時候靜態內部類才會被載入

private

static singleton_sta getsingleton()

}

物件初始化的時機不是singleton被載入的時候,而是靜態方法getsingleton被呼叫時,使用classloader的載入機制完成單例建立的懶載入。

補充說明一下類的初始化過程:

使用classloader載入類:查詢並載入類的二進位制資料

連線:驗證:確保被載入類的正確性

準備:為類的靜態變數分配記憶體,並將其初始化為預設值

解析:把類中的符號引用轉換成直接引用

其中準備和解析的順序不一定

初始化

類初始化的時機:

設計模式 理解單例設計模式

設計模式分類 結構型行為型 建立型 單例模式屬於建立型設計模式 單例模式主要使用在 日誌記錄 將多項服務的日誌資訊按照順序儲存到乙個特定日誌檔案 資料庫操作 使用乙個資料庫物件進行操作,保證資料的一致性 印表機後台處理程式 以及其他程式 該程式執行過程中 只能生成乙個例項 避免對同一資源產生相互衝突...

設計模式之單例模式理解

單例,從名字上面就可以看出來,首先他肯定是乙個類例項,然後他同時只能允許乙個訪問,那麼這樣才構成了乙個單例,單例模式在我們實際開發中應用非常廣泛,比如我們建立了乙個資料庫連線池,然後又建立了乙個工具類把這個連線池與執行緒進行繫結,那麼我們就可以實現基於執行緒來實現對事務管控,資料庫連線是多次的,但是...

單例設計模式的理解

單例模式分為 餓漢式 一勞永逸 因此是在類載入的時候就建立好,放在那。懶漢式每次呼叫,每次返回,引出了乙個高大上的名詞 延遲載入 雙重檢查鎖定 double check locking 如果有多個執行緒對乙個變數的狀態進行判斷,則需要將這個變數使用volatile修飾。class lazysingl...