golang設計模式之單例模式

2021-10-10 08:17:42 字數 1745 閱讀 3521

保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點

由於單例模式只生成乙個例項,減少系統效能開銷,當乙個物件的生產需要比較多資源時,就可以通過在應用啟動的時候直接產生乙個單例物件,然後永久駐留記憶體,例如日誌模組

單例模式可以在系統設定全域性訪問點,優化資源共享問題,比如資料庫裡連線池

餓漢式(呼叫效率高,不能延時載入)

懶漢式(呼叫效率不高,可以延時載入)

懶漢加鎖(呼叫效率不高,可以延時載入)

雙重鎖(呼叫效率不高,可以延時載入)

once單例(呼叫效率高,不能延時載入)

缺點:系統初始化時載入,有可能沒有用到getinstance方法,但是一直是占用資源的,如果初始化比較複雜,載入時間會長

type singletondemon2 struct

var singletondemon2 =

&singletondemon2

func

getinstance()

*singletondemon2

缺點:延時載入,懶載入,真正用的時候才載入,資源利用率高了,但是每次調getinstance用都要同步,併發量高得時候有可能會建立多個物件

type singletondemon1 struct

var singletondemon1 *singletondemon1

func

getinstance()

*singletondemon1

}return singletondemon1

}

缺點:多執行緒併發量高的時候,每次都要lock,影響效能

type singletondemon3 struct

var singletondemon3 *singletondemon3

var mutex sync.mutex

func

getinstance3()

*singletondemon3

}return singletondemon3

}

判斷不為空時在加鎖,當instance為null並且同時有2個執行緒呼叫getinstance方法時候,他們都會通過第一重的instance == null 的判斷。如果沒有第二個判斷,就多new了空間,而且不能釋放。

type singletondemon4 struct

var singletondemon4 *singletondemon4

var mutx sync.mutex

func

getinstance4()

*singletondemon4

mutx.

unlock()

return singletondemon4

}}mutx.

unlock()

return singletondemon4

}

看once.do原始碼可以看到只有在 done 等於 0 的時候才呼叫 f(),一旦呼叫後 done 的值被置為 1

type singleton struct

var singleton *singleton

var once sync.once

func

getinstance()

*singleton })

return singleton

}

golang設計模式 單例模式

單例 golang中實現單例模式非常簡單,那就是使用指標物件。根據物件的例項化時間,可以分為餓漢式和懶漢式。物件type person struct 併發測試 func main wg.wait 餓漢式 直接建立好物件,這樣不需要判斷為空,同時也是執行緒安全。唯一的缺點是在匯入包的同時會建立該物件,...

Golang單例模式

單例物件的類必須保證只有乙個例項存在,全域性有唯一介面訪問。懶漢方式 指全域性的單例例項在第一次被使用時構建。餓漢方式 指全域性的單例例項在類裝載時構建。type singleton struct var ins singleton func getins singleton return ins ...

golang單例模式

單例物件的類必須保證只有乙個例項存在,全域性有唯一介面訪問。type singleton struct var ins singleton func getins singleton return ins 缺點 非執行緒安全。當正在建立時,有執行緒來訪問此時ins nil就會再建立,單例類就會有多個...