亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang并發(fā)安全及讀寫(xiě)互斥鎖的示例分析

 更新時(shí)間:2022年04月14日 13:29:09   作者:Jeff的技術(shù)棧  
這篇文章主要為大家介紹了golang并發(fā)安全及讀寫(xiě)互斥鎖的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

并發(fā)安全和鎖

有時(shí)候在Go代碼中可能會(huì)存在多個(gè)goroutine同時(shí)操作一個(gè)資源(臨界區(qū)),這種情況會(huì)發(fā)生競(jìng)態(tài)問(wèn)題(數(shù)據(jù)競(jìng)態(tài))。類(lèi)比現(xiàn)實(shí)生活中的例子有十字路口被各個(gè)方向的的汽車(chē)競(jìng)爭(zhēng);還有火車(chē)上的衛(wèi)生間被車(chē)廂里的人競(jìng)爭(zhēng)。

舉個(gè)例子:

var x int64
var wg sync.WaitGroup
func add() {
    for i := 0; i < 5000; i++ {
        x = x + 1
    }
    wg.Done()
}
func main() {
    wg.Add(2)
    go add()
    go add()
    wg.Wait()
    fmt.Println(x)
} 

上面的代碼中我們開(kāi)啟了兩個(gè)goroutine去累加變量x的值,這兩個(gè)goroutine在訪問(wèn)和修改x變量的時(shí)候就會(huì)存在數(shù)據(jù)競(jìng)爭(zhēng),導(dǎo)致最后的結(jié)果與期待的不符。

互斥鎖

import (
	"fmt"
	"sync"
)
var lock sync.Mutex
lock.Lock() // 加鎖
lock.Unlock() // 解鎖

互斥鎖是一種常用的控制共享資源訪問(wèn)的方法,它能夠保證同時(shí)只有一個(gè)goroutine可以訪問(wèn)共享資源。Go語(yǔ)言中使用sync包的Mutex類(lèi)型來(lái)實(shí)現(xiàn)互斥鎖。 使用互斥鎖來(lái)修復(fù)上面代碼的問(wèn)題:

var x int64
var wg sync.WaitGroup
var lock sync.Mutex
func add() {
    for i := 0; i < 5000; i++ {
        lock.Lock() // 加鎖
        x = x + 1
        lock.Unlock() // 解鎖
    }
    wg.Done()
}
func main() {
    wg.Add(2)
    go add()
    go add()
    wg.Wait()
    fmt.Println(x)
} 

使用互斥鎖能夠保證同一時(shí)間有且只有一個(gè)goroutine進(jìn)入臨界區(qū),其他的goroutine則在等待鎖;當(dāng)互斥鎖釋放后,等待的goroutine才可以獲取鎖進(jìn)入臨界區(qū),多個(gè)goroutine同時(shí)等待一個(gè)鎖時(shí),喚醒的策略是隨機(jī)的。

讀寫(xiě)互斥鎖

import (
	"fmt"
	"sync"
)
var rwlock sync.RWMutex
rwlock.Lock()   // 加寫(xiě)鎖
rwlock.Unlock() // 解寫(xiě)鎖

互斥鎖是完全互斥的,但是有很多實(shí)際的場(chǎng)景下是讀多寫(xiě)少的,當(dāng)我們并發(fā)的去讀取一個(gè)資源不涉及資源修改的時(shí)候是沒(méi)有必要加鎖的,這種場(chǎng)景下使用讀寫(xiě)鎖是更好的一種選擇。讀寫(xiě)鎖在Go語(yǔ)言中使用sync包中的RWMutex類(lèi)型。

讀寫(xiě)鎖分為兩種:讀鎖和寫(xiě)鎖。當(dāng)一個(gè)goroutine獲取讀鎖之后,其他的goroutine如果是獲取讀鎖會(huì)繼續(xù)獲得鎖,如果是獲取寫(xiě)鎖就會(huì)等待;當(dāng)一個(gè)goroutine獲取寫(xiě)鎖之后,其他的goroutine無(wú)論是獲取讀鎖還是寫(xiě)鎖都會(huì)等待。

讀寫(xiě)鎖示例:

var (
    x      int64
    wg     sync.WaitGroup
    lock   sync.Mutex
    rwlock sync.RWMutex
)
func write() {
    // lock.Lock()   // 加互斥鎖
    rwlock.Lock() // 加寫(xiě)鎖
    x = x + 1
    time.Sleep(10 * time.Millisecond) // 假設(shè)讀操作耗時(shí)10毫秒
    rwlock.Unlock()                   // 解寫(xiě)鎖
    // lock.Unlock()                     // 解互斥鎖
    wg.Done()
}
func read() {
    // lock.Lock()                  // 加互斥鎖
    rwlock.RLock()               // 加讀鎖
    time.Sleep(time.Millisecond) // 假設(shè)讀操作耗時(shí)1毫秒
    rwlock.RUnlock()             // 解讀鎖
    // lock.Unlock()                // 解互斥鎖
    wg.Done()
}
func main() {
    start := time.Now()
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go write()
    }

    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go read()
    }
    wg.Wait()
    end := time.Now()
    fmt.Println(end.Sub(start))
}

需要注意的是讀寫(xiě)鎖非常適合讀多寫(xiě)少的場(chǎng)景,如果讀和寫(xiě)的操作差別不大,讀寫(xiě)鎖的優(yōu)勢(shì)就發(fā)揮不出來(lái)。

以上就是golang并發(fā)安全及讀寫(xiě)互斥鎖的示例分析的詳細(xì)內(nèi)容,更多關(guān)于golang并發(fā)安全及讀寫(xiě)互斥鎖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言開(kāi)發(fā)環(huán)境搭建與初探(Windows平臺(tái)下)

    Go語(yǔ)言開(kāi)發(fā)環(huán)境搭建與初探(Windows平臺(tái)下)

    Go是Google開(kāi)發(fā)的一種編譯型,並發(fā)型,并具有垃圾回收功能的編程語(yǔ)言,可能很多人想學(xué)習(xí)go語(yǔ)言,那么首先就要了解go語(yǔ)言的環(huán)境配置方法
    2014-10-10
  • 高效封禁:利用Go封裝功能,提升封禁操作效率

    高效封禁:利用Go封裝功能,提升封禁操作效率

    在網(wǎng)絡(luò)安全領(lǐng)域,封禁操作是一項(xiàng)重要的任務(wù),用于阻止惡意行為和保護(hù)系統(tǒng)安全,而利用Go語(yǔ)言封裝功能可以提升封禁操作的效率,Go語(yǔ)言具有高效的并發(fā)性能和簡(jiǎn)潔的語(yǔ)法,使得開(kāi)發(fā)者可以快速構(gòu)建高性能的封禁系統(tǒng),
    2023-10-10
  • 深入理解Go Gin框架中間件的實(shí)現(xiàn)原理

    深入理解Go Gin框架中間件的實(shí)現(xiàn)原理

    在Go Gin框架中,中間件是一種在請(qǐng)求處理過(guò)程中插入的功能模塊,它可以用于處理請(qǐng)求的前置和后置邏輯,例如認(rèn)證、日志記錄、錯(cuò)誤處理等,本文將給大家介紹一下Go Gin框架中間件的實(shí)現(xiàn)原理,需要的朋友可以參考下
    2023-09-09
  • golang實(shí)現(xiàn)可中斷的流式下載功能

    golang實(shí)現(xiàn)可中斷的流式下載功能

    這篇文章主要給大家介紹了golang實(shí)現(xiàn)可中斷的流式下載,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Golang源碼分析之golang/sync之singleflight

    Golang源碼分析之golang/sync之singleflight

    golang/sync庫(kù)拓展了官方自帶的sync庫(kù),提供了errgroup、semaphore、singleflight及syncmap四個(gè)包,本次先分析第一個(gè)包errgroup的源代碼,下面這篇文章主要給大家介紹了關(guān)于Golang源碼分析之golang/sync之singleflight的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Go框架自動(dòng)化工具Beego使用詳解

    Go框架自動(dòng)化工具Beego使用詳解

    這篇文章主要為大家介紹了Go框架自動(dòng)化工具Beego使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 從基礎(chǔ)到高級(jí)全方位解析Go中反射的應(yīng)用

    從基礎(chǔ)到高級(jí)全方位解析Go中反射的應(yīng)用

    本文我們將全面深入地探討Go語(yǔ)言的反射機(jī)制,從反射的基礎(chǔ)概念、為什么需要反射,到如何在Go中實(shí)現(xiàn)反射,以及在高級(jí)編程場(chǎng)景如泛型編程和插件架構(gòu)中的應(yīng)用,需要的可以參考下
    2023-10-10
  • go語(yǔ)言中的二維切片賦值

    go語(yǔ)言中的二維切片賦值

    這篇文章主要介紹了go語(yǔ)言中的二維切片賦值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 解決Go中攔截HTTP流數(shù)據(jù)時(shí)字段丟失的問(wèn)題

    解決Go中攔截HTTP流數(shù)據(jù)時(shí)字段丟失的問(wèn)題

    在開(kāi)發(fā)高并發(fā)的Web應(yīng)用時(shí),尤其是在處理HTTP代理和流數(shù)據(jù)攔截的場(chǎng)景下,遇到數(shù)據(jù)丟失的問(wèn)題并不罕見(jiàn),最近,在一個(gè)項(xiàng)目中,我遇到了一個(gè)棘手的問(wèn)題:在攔截并轉(zhuǎn)發(fā)HTTP流數(shù)據(jù)的過(guò)程中,某些數(shù)據(jù)字段因?yàn)樘幚磉^(guò)快而被丟失,所以本文給大家介紹如何解決這個(gè)問(wèn)題
    2024-08-08
  • Go語(yǔ)言包和包管理詳解

    Go語(yǔ)言包和包管理詳解

    這篇文章主要為大家介紹了Go語(yǔ)言包和包管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論