寫乙個高併發下面的單例模式 go語言併發之鎖的基操

2021-10-14 06:28:08 字數 1270 閱讀 9275

go語言除了使用goroutine和channel這種csp模型,也支援傳統的併發模型,今天我們就說一下go中的鎖的使用。

互斥鎖是傳統併發對共享的資源進行訪問空值的主要手段,在 sync 包中,mutex 結構體表示。該結構體具備兩個公共的方法,lock和unlock,前者鎖定當前的互斥量,後者是解鎖。這兩個一定要一起使用,由於defer的存在,我們基本上是不會忘記解鎖的,**示例:

import "sync"func main()
互斥鎖只能鎖定一次,當在解鎖之前再次進行加鎖,便會死鎖狀態,如果在加鎖前解鎖,便會報錯「panic: sync: unlock of unlocked mutex」還有另外乙個鎖就是讀寫鎖,顧名思義就是對讀寫操作的鎖,與互斥鎖的不同處主要是可以分別針對讀寫操作進行鎖定和解鎖。讀寫鎖控制下,多個寫操作是互斥的,讀與寫操作也是互斥的,但是多個讀操作之間是不存在互斥的。在 sync 包中,rwmutex 結構體表示。

讀寫鎖具有下面四個方法:

var m sync.rwmutexm.lock()m.unlock()m.rlock()m.runlock()
lock和unlock是對寫操作的鎖,rlock和runlock是對讀操作的鎖。

讀寫鎖的寫鎖只能鎖定一次,解鎖前不能多次鎖定,讀鎖可以多次,但讀解鎖次數最多只能比讀鎖次數多一次,一般情況下不建議讀解鎖次數多餘讀鎖次數

在寫**時,如果map遇到了併發的寫入資料,程式會panic的,所以對map的操作我們要考慮到併發,我們可以在map寫入資料時對其加鎖。

ma := make(map[string]string)m.lock()ma["key"] = "valuem.unlock()
當然go語言給我們提供了一種同步的map,sync.map,這個我們不需要加鎖,只需要呼叫其已有的方法即可,具體內容不在這裡實現,感興趣的可以看一下同步map的使用。

還有乙個就是sync包中的once,在我之前的單例模式的文章中說過,這個是只會執行一次,所以我們基本上都是在這裡面做只需要一次的初始化的操作,當然這個也是go語言實現單例模式(對設計模式感興趣的同學可以看我之前的文章)的不二選擇。

var ma map[string]strin**ar once sync.onceonce.do(func() )

寫乙個高併發下面的單例模式 單例模式詳解

保證整個系統中乙個類只有乙個物件的例項,實現這種功能的方式就叫單例模式。1 單例模式節省公共資源 比如 大家都要喝水,但是沒必要每人家裡都打一口井是吧,通常的做法是整個村里打乙個井就夠了,大家都從這個井裡面打水喝。對應到我們計算機裡面,像日誌管理 印表機 資料庫連線池 應用配置。2 單例模式方便控制...

寫乙個高併發下面的單例模式 設計模式之單例模式

乙個類只允許建立唯一乙個物件 或者例項 那這個類就是乙個單例類,這種設計模式就叫作單例設計模式,簡稱單例模式。經典的設計模式有 23 種,如果隨便抓乙個程式設計師,讓他說一說最熟悉的 3 種設計模式,那其中肯定會包含今天要講的單例模式,單例模式主要用來確保某個型別的例項只能有乙個。比如手機上的藍芽之...

Python 寫乙個單例模式

class amimal object a none b true def new cls,args,kwargs if not cls.a cls.a object.new cls 呼叫基類的 new 方法建立物件,修改類屬性 a return cls.a def init self,name,a...