單例模式的兩種方式,執行緒安全的懶漢式單例模式

2021-10-08 18:49:14 字數 1841 閱讀 4040

隨手記。

單例模式作為23種設計模式種比較經典的,一般都要求能夠手寫(很簡單),下面寫一下兩種實現方式:

步驟:1.新建乙個類,提供私有構造器

2.使用構造器宣告當前物件例項成員

3.宣告public static的返回當前類物件的方法

4.要在方法中使用私有物件成員,要將例項成員宣告為static的

public

class

test

}class

bank

// 2.宣告當前類物件

// 4.此物件也必須宣告成static的

private

static bank instance =

newbank()

;// 3.宣告public、static的返回當前類物件的方法

public

static bank getinstance()

}

步驟與餓漢式相同,存在兩個小細節上的不同。

public

class

test

}class

bank

// 2.宣告當前類物件,將其賦為null

// 4.此物件也必須宣告成static的

private

static bank instance = null;

// 3.宣告public、static的返回當前類物件的方法

public

static bank getinstance()

return instance;

}}

如何區分餓漢式和懶漢式?

餓漢式:在宣告例項成員的時候就造好物件。

懶漢式:在呼叫方法時才造物件。

對比一下兩者的不同:

餓漢式:物件載入時間長;執行緒安全。

懶漢式:延遲了物件的載入;目前這種寫法執行緒不安全,例如三個執行緒幾乎同時第一次呼叫這個方法返回bank類的例項,這時instance是null,三個執行緒都進入了if,最後在記憶體中生成了三個bank例項,違反了單例原則。

這裡不關心呼叫,只關心如何在類中實現。

public

class

singletonlazy

}class

bank

private

static bank instance = null;

//public static synchronized bank getinstance()

return instance;}}

}

上面的方式有弊端:在呼叫方法,記憶體中已有例項之後,後續多個執行緒 a b c 呼叫方法時,都會進入同步**塊,這就涉及到執行緒阻塞等問題,例如 a 搶到了執行權,則 b c 需要等待,浪費時間,效率不高。

第二種方式:除了與第乙個呼叫方法的執行緒幾乎一起到達的其他執行緒會進入同步**塊中判斷,後面再來呼叫方法的多個執行緒 a b c,直接在外層 if 就走了,不會進入同步**塊,不會涉及到執行緒阻塞(排隊)。

public

class

singletonlazy

}class

bank

private

static bank instance = null;

public

static bank getinstance()

}}return instance;

}}

單例模式的兩種方式

首先,單例模式是指在程式執行的過程中,保證該類的例項只有乙個可以被外界訪問 可用於讀取配置檔案,以保證沒有對外部資源的併發操作 單例模式分為飽漢模式和飢漢模式。飽漢模式,也是我們說熟知的單例模式,為類在初始化的時候就進行了類的例項化,getinstance方法只需要自動獲取就可以了 飢漢模式為類在初...

單例模式(懶載入 執行緒安全)

1 雙重檢查 單例模式 懶載入 執行緒安全 一 雙重檢查方式 public class singletondoublecheck 雙重檢查 public static synchronized singletondoublecheck getinstance return instance 2 靜態...

單例模式的兩種執行緒安全並且效率的寫法

include include include include using namespace std mutex mtx 懶漢模式 template class singleton return single private singleton data new t singleton const...