GO中公平鎖和非公平鎖的具體使用
公平鎖和非公平鎖是計(jì)算機(jī)科學(xué)中的兩種鎖機(jī)制,它們主要用于多線程編程,以控制對(duì)共享資源的訪問(wèn)。
一、公平鎖 (Fair Lock)
1. 概念
公平鎖是一種按照請(qǐng)求順序授予鎖的機(jī)制,即先請(qǐng)求鎖的線程會(huì)先獲得鎖,后請(qǐng)求鎖的線程會(huì)后獲得鎖。這種鎖通過(guò)維護(hù)一個(gè)隊(duì)列來(lái)管理等待的線程,確保每個(gè)線程都能公平地獲取到鎖。
2. 優(yōu)點(diǎn)
- 避免饑餓:所有線程都有機(jī)會(huì)獲得鎖,不會(huì)出現(xiàn)某些線程長(zhǎng)期得不到鎖的情況。
- 可預(yù)測(cè)性:鎖的獲取是按順序進(jìn)行的,具有較好的可預(yù)測(cè)性。
3. 缺點(diǎn)
- 性能開(kāi)銷:由于需要維護(hù)一個(gè)隊(duì)列,公平鎖在管理上有一定的性能開(kāi)銷。
- 上下文切換增加:由于公平鎖可能需要頻繁地切換線程,導(dǎo)致上下文切換的次數(shù)增加,影響性能。
二、非公平鎖 (Unfair Lock)
1. 概念
非公平鎖是一種不按照請(qǐng)求順序授予鎖的機(jī)制,即任何線程都有可能在任何時(shí)候獲得鎖,而不考慮請(qǐng)求順序。這種鎖通常會(huì)優(yōu)先考慮當(dāng)前已經(jīng)持有鎖的線程,以提高系統(tǒng)的吞吐量。
2. 優(yōu)點(diǎn)
- 高性能:由于沒(méi)有隊(duì)列管理的開(kāi)銷,非公平鎖通常性能較高,特別是在高并發(fā)場(chǎng)景下。
- 減少上下文切換:非公平鎖可以減少線程之間的上下文切換,提升效率。
3. 缺點(diǎn)
- 可能導(dǎo)致饑餓:某些線程可能長(zhǎng)時(shí)間得不到鎖,導(dǎo)致線程饑餓。
- 不可預(yù)測(cè)性:鎖的獲取是隨機(jī)的,具有較低的可預(yù)測(cè)性。
三、Go語(yǔ)言中的實(shí)現(xiàn)
Go語(yǔ)言中的鎖主要通過(guò)sync包提供,常用的鎖有Mutex(互斥鎖)和RWMutex(讀寫(xiě)互斥鎖)。Go的sync.Mutex默認(rèn)實(shí)現(xiàn)的是一種非公平鎖,但也可以實(shí)現(xiàn)公平鎖。
1. 非公平鎖的實(shí)現(xiàn)
Go標(biāo)準(zhǔn)庫(kù)中的sync.Mutex是非公平鎖的實(shí)現(xiàn)。它的主要結(jié)構(gòu)和實(shí)現(xiàn)方式如下:
type Mutex struct {
state int32
sema uint32
}
func (m *Mutex) Lock() {
// 快速路徑:嘗試直接獲取鎖
if atomic.CompareAndSwapInt32(&m.state, 0, 1) {
return
}
// 慢速路徑:獲取不到鎖時(shí),調(diào)用lockSlow方法
m.lockSlow()
}
func (m *Mutex) Unlock() {
// 快速路徑:嘗試直接釋放鎖
if atomic.CompareAndSwapInt32(&m.state, 1, 0) {
return
}
// 慢速路徑:釋放鎖時(shí),調(diào)用unlockSlow方法
m.unlockSlow()
}
2. 公平鎖的實(shí)現(xiàn)
Go標(biāo)準(zhǔn)庫(kù)不直接提供公平鎖的實(shí)現(xiàn),但我們可以通過(guò)其他方式實(shí)現(xiàn)公平鎖,比如通過(guò)條件變量(sync.Cond)來(lái)維護(hù)等待的隊(duì)列,從而實(shí)現(xiàn)公平鎖。
type FairMutex struct {
mu sync.Mutex
cond *sync.Cond
waiting []chan struct{}
}
func NewFairMutex() *FairMutex {
fm := &FairMutex{}
fm.cond = sync.NewCond(&fm.mu)
return fm
}
func (fm *FairMutex) Lock() {
fm.mu.Lock()
defer fm.mu.Unlock()
ch := make(chan struct{})
fm.waiting = append(fm.waiting, ch)
if len(fm.waiting) > 1 {
<-ch
}
}
func (fm *FairMutex) Unlock() {
fm.mu.Lock()
defer fm.mu.Unlock()
if len(fm.waiting) > 0 {
fm.waiting = fm.waiting[1:]
if len(fm.waiting) > 0 {
close(fm.waiting[0])
}
}
}
四、總結(jié)
- 公平鎖:按請(qǐng)求順序授予鎖,避免饑餓,維護(hù)隊(duì)列,開(kāi)銷較大。
- 非公平鎖:隨機(jī)授予鎖,高性能,可能導(dǎo)致饑餓。
在Go語(yǔ)言中,默認(rèn)提供的是非公平鎖。公平鎖可以通過(guò)自定義實(shí)現(xiàn)來(lái)滿足特定需求。
到此這篇關(guān)于GO中公平鎖和非公平鎖的具體使用的文章就介紹到這了,更多相關(guān)GO 公平鎖和非公平鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang 實(shí)現(xiàn)復(fù)制文件夾同時(shí)復(fù)制文件
這篇文章主要介紹了Golang 實(shí)現(xiàn)復(fù)制文件夾同時(shí)復(fù)制文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Golang中g(shù)orm無(wú)法將字段更新為空值
本文主要介紹了Golang中g(shù)orm無(wú)法將字段更新為空值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
Golang關(guān)鍵字select的常用用法總結(jié)
這篇文章主要為大家詳細(xì)介紹了golang中select關(guān)鍵字的常用用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10
Golang創(chuàng)建第一個(gè)web項(xiàng)目(Gin+Gorm)
本文主要介紹了Golang創(chuàng)建第一個(gè)web項(xiàng)目(Gin+Gorm),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06

