go中的線程同步(鎖機(jī)制)原理,互斥鎖和讀寫鎖

一個(gè)資源,如果需要多個(gè)接口去訪問,那么需要進(jìn)行加鎖,

但是這個(gè)鎖在不同的場景下面是需要加不同的鎖的, 如果胡亂加鎖,那么就會(huì)造成程序運(yùn)行緩慢

線程同步加鎖必要的標(biāo)準(zhǔn)庫包是sync
一般情況有兩種鎖,一種是互斥鎖, 一種是讀寫鎖,其中加了互斥鎖的程序性能比讀寫鎖的性能要低200倍

互斥鎖, var mu sync.Mutex``讀和寫頻率一樣的場景
讀寫鎖, var mu sync.RWMutex 讀多寫少的場景

互斥鎖

一個(gè)資源,如果需要多個(gè)接口去訪問,那么需要進(jìn)行加鎖,但是這個(gè)鎖適合的場景是,讀和寫頻率一樣的場景,因?yàn)闀?huì)影響性能

舉例:

var hLock sync.Mutex;
func main() {
    ch := make(chan int)
    for i := 0; i < 10; i++ {
        go test(ch, i)
    }
    for i := 0; i < 10; i++ {
        <-ch
    }
}
func test(ch chan int, i int) {
    hLock.Lock()
    f[0] =byte(i)
    fmt.Println(f)
    ch <- i
    hLock.Unlock()
}

讀寫鎖

一個(gè)資源,如果需要多個(gè)接口去訪問,那么需要進(jìn)行加鎖,但是這個(gè)鎖適合的場景是,讀多寫少的場景,
舉例好比教室里面的黑板, 全班的同學(xué)都可以讀黑板, 但是能夠改變黑板上面的文字只有老師一個(gè)人,
那么如果有兩個(gè)老師同時(shí)更改黑板內(nèi)容的時(shí)候,就會(huì)造成同學(xué)們無法確定該讀誰寫的文字
因此其中一個(gè)老師在黑板上書寫文字內(nèi)容的時(shí)候, 需要把這一過程上鎖,
一旦上了讀寫鎖,那么第二個(gè)老師只能等待第一個(gè)老師書寫完畢才可以進(jìn)行書寫

舉例:

var rwLock sync.RWMutex;
func main() {
    //  hLock  := sync.Locker
    ch := make(chan int)
    for i := 0; i < 10; i++ {
        go test(ch, i)
    }
    for i := 0; i < 10; i++ {
        <-ch
    }
}
func test(ch chan int, i int) {
    rwLock.RLock()
    f[0] =byte(i)
    fmt.Println(f)
    fmt.Println(f)
    fmt.Println(f)
    fmt.Println(f)
    fmt.Println(f)
    ch <- i
    rwLock.RUnlock()
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容