AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

使用互斥鎖(Mutex)管理共享資源

來源: 責(zé)編: 時(shí)間:2023-12-25 09:35:47 257觀看
導(dǎo)讀在Go中確保并發(fā)安全性并發(fā)是Go中的一個(gè)強(qiáng)大功能,它允許多個(gè)Goroutines(并發(fā)線程)同時(shí)執(zhí)行。然而,伴隨著強(qiáng)大的功能也帶來了大量的責(zé)任。當(dāng)多個(gè)Goroutines并發(fā)地訪問和修改共享資源時(shí),可能會(huì)導(dǎo)致數(shù)據(jù)損壞、數(shù)據(jù)競(jìng)爭(zhēng)(race con

在Go中確保并發(fā)安全性

并發(fā)是Go中的一個(gè)強(qiáng)大功能,它允許多個(gè)Goroutines(并發(fā)線程)同時(shí)執(zhí)行。然而,伴隨著強(qiáng)大的功能也帶來了大量的責(zé)任。當(dāng)多個(gè)Goroutines并發(fā)地訪問和修改共享資源時(shí),可能會(huì)導(dǎo)致數(shù)據(jù)損壞、數(shù)據(jù)競(jìng)爭(zhēng)(race conditions)和不可預(yù)測(cè)的程序行為。為了解決這些問題,Go提供了一種稱為互斥鎖(Mutex,互斥排他鎖的縮寫)的同步原語。在本文中,我們將探討互斥鎖在管理共享資源中的作用,以及在并發(fā)編程中使用它的必要性。QSc28資訊網(wǎng)——每日最新資訊28at.com

QSc28資訊網(wǎng)——每日最新資訊28at.com

互斥鎖簡(jiǎn)介

互斥鎖是一種同步原語,用于提供對(duì)共享資源或代碼關(guān)鍵部分的獨(dú)占訪問。它充當(dāng)了門衛(wèi)的角色,一次只允許一個(gè)Goroutine訪問和修改受保護(hù)的資源。當(dāng)一個(gè)Goroutine持有互斥鎖時(shí),所有試圖獲取它的其他Goroutines都必須等待。QSc28資訊網(wǎng)——每日最新資訊28at.com

互斥鎖提供了兩個(gè)基本方法:QSc28資訊網(wǎng)——每日最新資訊28at.com

  • Lock(): 這個(gè)方法獲取互斥鎖,授予對(duì)資源的獨(dú)占訪問。如果另一個(gè)Goroutine已經(jīng)持有該互斥鎖,新的Goroutine將被阻塞,直到它被釋放。
  • Unlock(): 這個(gè)方法釋放互斥鎖,允許其他等待的Goroutines獲取它并訪問資源。

互斥鎖的必要性

使用互斥鎖的原因在于,當(dāng)多個(gè)Goroutines并發(fā)訪問共享資源時(shí),這些資源容易遭受數(shù)據(jù)競(jìng)爭(zhēng)和不一致性的風(fēng)險(xiǎn)。以下是互斥鎖至關(guān)重要的一些常見場(chǎng)景:QSc28資訊網(wǎng)——每日最新資訊28at.com

1. 數(shù)據(jù)競(jìng)爭(zhēng)

數(shù)據(jù)競(jìng)爭(zhēng)發(fā)生在多個(gè)Goroutines并發(fā)訪問共享數(shù)據(jù)時(shí),其中至少一個(gè)Goroutine對(duì)其進(jìn)行修改。這可能導(dǎo)致不可預(yù)測(cè)和錯(cuò)誤的行為,因?yàn)閳?zhí)行順序是不確定的。互斥鎖通過一次只允許一個(gè)Goroutine訪問共享資源來幫助防止數(shù)據(jù)競(jìng)爭(zhēng)。QSc28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (    "fmt"    "sync")var sharedData intvar mu sync.Mutexfunc increment() {    mu.Lock()    sharedData++    mu.Unlock()}func main() {    var wg sync.WaitGroup    for i := 0; i < 100; i++ {        wg.Add(1)        go func() {            defer wg.Done()            increment()        }()    }    wg.Wait()    fmt.Println("Shared Data:", sharedData)}

在這個(gè)示例中,多個(gè)Goroutines并發(fā)地增加sharedData變量,如果沒有使用互斥鎖,這將導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)。QSc28資訊網(wǎng)——每日最新資訊28at.com

2. 臨界區(qū)(Critical Sections)

臨界區(qū)是訪問共享資源的代碼部分。當(dāng)多個(gè)Goroutines試圖同時(shí)訪問同一個(gè)臨界區(qū)時(shí),可能會(huì)導(dǎo)致不可預(yù)測(cè)的行為。互斥鎖確保一次只有一個(gè)Goroutine進(jìn)入臨界區(qū),從而保證對(duì)共享資源的有序訪問。QSc28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (    "fmt"    "sync")var (    sharedResource int    mu             sync.Mutex)func updateSharedResource() {    mu.Lock()    // Critical section: Access and modify sharedResource    sharedResource++    mu.Unlock()}func main() {    var wg sync.WaitGroup    for i := 0; i < 100; i++ {        wg.Add(1)        go func() {            defer wg.Done()            updateSharedResource()        }()    }    wg.Wait()    fmt.Println("Shared Resource:", sharedResource)}

在這個(gè)示例中,updateSharedResource 函數(shù)代表一個(gè)臨界區(qū),其中訪問并修改了 sharedResource。如果沒有使用互斥鎖,對(duì)這個(gè)臨界區(qū)的并發(fā)訪問可能會(huì)導(dǎo)致不正確的結(jié)果。QSc28資訊網(wǎng)——每日最新資訊28at.com

互斥鎖定

互斥鎖提供了兩個(gè)基本操作:鎖定和解鎖。讓我們首先了解互斥鎖的鎖定操作:QSc28資訊網(wǎng)——每日最新資訊28at.com

鎖定互斥鎖:當(dāng)一個(gè)Goroutine想要訪問共享資源或一個(gè)臨界區(qū)時(shí),它會(huì)調(diào)用互斥鎖上的Lock()方法。如果互斥鎖當(dāng)前是未鎖定的,它將變?yōu)殒i定狀態(tài),從而允許Goroutine繼續(xù)執(zhí)行。如果互斥鎖已被另一個(gè)Goroutine鎖定,調(diào)用的Goroutine將被阻塞,直到互斥鎖變?yōu)榭捎脿顟B(tài)。QSc28資訊網(wǎng)——每日最新資訊28at.com

下面是一個(gè)演示互斥鎖鎖定的代碼示例:QSc28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (    "fmt"    "sync")func main() {    var mu sync.Mutex    mu.Lock() // Lock the Mutex    // Critical section: Access and modify shared resource    fmt.Println("Locked the Mutex")    mu.Unlock() // Unlock the Mutex}

在這個(gè)示例中,mu.Lock() 調(diào)用鎖定了互斥鎖,確保一次只有一個(gè)Goroutine可以進(jìn)入臨界區(qū)。當(dāng)完成臨界區(qū)后,使用 mu.Unlock() 解鎖互斥鎖。QSc28資訊網(wǎng)——每日最新資訊28at.com

互斥鎖解鎖

解鎖互斥鎖:當(dāng)一個(gè)Goroutine完成其臨界區(qū)的執(zhí)行并且不再需要對(duì)共享資源進(jìn)行獨(dú)占訪問時(shí),它會(huì)在互斥鎖上調(diào)用 Unlock() 方法。這個(gè)操作會(huì)釋放互斥鎖,從而允許其他Goroutines獲取它。QSc28資訊網(wǎng)——每日最新資訊28at.com

以下是互斥鎖解鎖的執(zhí)行方式:QSc28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (    "fmt"    "sync")func main() {    var mu sync.Mutex    mu.Lock() // Lock the Mutex    // Critical section: Access and modify shared resource    fmt.Println("Locked the Mutex")    mu.Unlock() // Unlock the Mutex    fmt.Println("Unlocked the Mutex")}

在這個(gè)示例中,在臨界區(qū)之后調(diào)用了 mu.Unlock() 以釋放互斥鎖,使其可供其他Goroutines使用。QSc28資訊網(wǎng)——每日最新資訊28at.com

避免死鎖

盡管互斥鎖是確保并發(fā)安全性的強(qiáng)大工具,但如果使用不當(dāng),它們也可能引入死鎖。死鎖 是指兩個(gè)或多個(gè)Goroutines被卡住,彼此等待釋放資源的情況。為了避免死鎖,請(qǐng)遵循以下最佳實(shí)踐:QSc28資訊網(wǎng)——每日最新資訊28at.com

  • 始終解鎖:確保在鎖定后解鎖互斥鎖。如果不這樣做,可能會(huì)導(dǎo)致死鎖。
  • **使用 defer**:為了確保互斥鎖始終被解鎖,考慮使用 defer 語句在函數(shù)結(jié)束時(shí)解鎖它們。
  • 避免循環(huán)依賴:小心循環(huán)依賴的情況,其中多個(gè)Goroutines互相等待釋放資源。設(shè)計(jì)代碼時(shí)要避免這種情況。
package mainimport (    "fmt"    "sync")func main() {    var mu sync.Mutex    mu.Lock() // Lock the Mutex    // Critical section: Access and modify shared resource    // Oops! Forgot to unlock the Mutex    // mu.Unlock() // Uncomment this line to avoid deadlock    fmt.Println("Locked the Mutex")    // ... Some more code    // Potential deadlock if mu.Unlock() is not called}

在這個(gè)示例中,如果遺忘或注釋掉 mu.Unlock() 這一行,由于互斥鎖持續(xù)保持鎖定狀態(tài),可能會(huì)發(fā)生死鎖。QSc28資訊網(wǎng)——每日最新資訊28at.com

臨界區(qū)

什么是臨界區(qū)?QSc28資訊網(wǎng)——每日最新資訊28at.com

在并發(fā)編程中,臨界區(qū) 是指訪問共享資源或變量的代碼部分。它被稱為“臨界”是因?yàn)樵谌魏谓o定時(shí)刻只應(yīng)允許一個(gè)Goroutine執(zhí)行它。當(dāng)多個(gè)Goroutines并發(fā)訪問一個(gè)臨界區(qū)時(shí),可能會(huì)導(dǎo)致數(shù)據(jù)損壞或競(jìng)態(tài)條件,其中執(zhí)行的順序變得不可預(yù)測(cè)。QSc28資訊網(wǎng)——每日最新資訊28at.com

使用互斥鎖保護(hù)臨界區(qū)

互斥鎖用于保護(hù)臨界區(qū),確保一次只有一個(gè)Goroutine可以訪問它們。互斥鎖提供了兩個(gè)基本方法:QSc28資訊網(wǎng)——每日最新資訊28at.com

  • Lock(): 此方法鎖定互斥鎖,允許當(dāng)前的Goroutine進(jìn)入臨界區(qū)。如果另一個(gè)Goroutine已經(jīng)鎖定了互斥鎖,調(diào)用該方法的Goroutine將被阻塞,直到互斥鎖被釋放。
  • Unlock(): 此方法解鎖互斥鎖,允許其他Goroutines獲取它并進(jìn)入臨界區(qū)。

以下是一個(gè)演示使用互斥鎖保護(hù)臨界區(qū)的示例:QSc28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (    "fmt"    "sync")var sharedResource intvar mu sync.Mutexfunc updateSharedResource() {    mu.Lock() // Lock the Mutex    // Critical section: Access and modify sharedResource    sharedResource++    mu.Unlock() // Unlock the Mutex}func main() {    var wg sync.WaitGroup    for i := 0; i < 100; i++ {        wg.Add(1)        go func() {            defer wg.Done()            updateSharedResource()        }()    }    wg.Wait()    fmt.Println("Shared Resource:", sharedResource)}

在這個(gè)示例中,updateSharedResource 函數(shù)代表一個(gè)臨界區(qū),其中 sharedResource 被訪問和修改。互斥鎖 mu 確保一次只有一個(gè)Goroutine可以進(jìn)入這個(gè)臨界區(qū)。QSc28資訊網(wǎng)——每日最新資訊28at.com

互斥鎖與通道的比較

互斥鎖并不是Go中管理并發(fā)的唯一工具;通道也是另一個(gè)重要的機(jī)制。以下是互斥鎖和通道的簡(jiǎn)要比較:QSc28資訊網(wǎng)——每日最新資訊28at.com

  • 互斥鎖 用于保護(hù)臨界區(qū)并確保對(duì)共享資源的獨(dú)占訪問。當(dāng)您需要對(duì)數(shù)據(jù)訪問進(jìn)行細(xì)粒度的控制時(shí),它們非常適用。
  • 通道 用于Goroutines之間的通信和同步。它們?yōu)榻粨Q數(shù)據(jù)和同步Goroutines提供了更高級(jí)別的抽象。

選擇使用互斥鎖還是通道取決于您程序的具體需求。當(dāng)您需要保護(hù)共享數(shù)據(jù)時(shí),互斥鎖是理想的選擇,而當(dāng)通信和Goroutines之間的協(xié)調(diào)是主要關(guān)注點(diǎn)時(shí),通道則表現(xiàn)出色。QSc28資訊網(wǎng)——每日最新資訊28at.com

總之,互斥鎖是Go中確保安全并發(fā)的強(qiáng)大工具。它們有助于保護(hù)臨界區(qū),防止數(shù)據(jù)競(jìng)態(tài),并確保共享資源的完整性。理解何時(shí)以及如何使用互斥鎖對(duì)于編寫既高效又可靠的并發(fā)Go程序至關(guān)重要。QSc28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-53352-0.html使用互斥鎖(Mutex)管理共享資源

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 拒絕寫重復(fù)代碼,試試這套開源的 SpringBoot 組件,效率翻倍

下一篇: 戶外用電無憂,還得看正浩

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 一加Ace2 Pro官宣:普及16G內(nèi)存 引領(lǐng)24G

    一加官方今天繼續(xù)為本月發(fā)布的新機(jī)一加Ace2 Pro帶來預(yù)熱,公布了內(nèi)存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領(lǐng),還有呢?#一加Ace2Pro#,2023 年 8 月,敬請(qǐng)期待。”同時(shí)
  • 印度登月最關(guān)鍵一步!月船三號(hào)今晚進(jìn)入環(huán)月軌道

    8月5日消息,據(jù)印度官方消息,月船三號(hào)將于北京時(shí)間今晚21時(shí)30分左右開始近月制動(dòng)進(jìn)入環(huán)月軌道。這是該探測(cè)器能夠成功的最關(guān)鍵步驟之一,如果成功將開始圍
  • JavaScript學(xué)習(xí) -AES加密算法

    引言在當(dāng)今數(shù)字化時(shí)代,前端應(yīng)用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進(jìn)行加密和解密操作。然而,這樣的操作在網(wǎng)絡(luò)傳輸和存儲(chǔ)中可能會(huì)受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個(gè)人開發(fā)仿造稿定設(shè)計(jì)的圖片編輯器到現(xiàn)在,不知不覺已過去一年時(shí)間了,期間我經(jīng)歷了裁員失業(yè)、面試找工作碰壁,寒冬下一直沒有很好地履行計(jì)劃.....這些就放在日
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級(jí)不香了。俗話說,兵無常勢(shì),水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級(jí)體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動(dòng)了近年來最大的人力制度改革,目前已形成一
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時(shí)間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進(jìn)展,其中榮耀、三星都已陸續(xù)發(fā)布了最新的折疊屏旗艦,尤其號(hào)榮耀Magi
  • iQOO Neo8系列新品發(fā)布會(huì)

    旗艦雙芯 更強(qiáng)更Pro
  • 華為舉行春季智慧辦公新品發(fā)布會(huì) 首次推出電子墨水屏平板

    北京時(shí)間2月27日晚,華為在巴塞羅那舉行春季智慧辦公新品發(fā)布會(huì),在海外市場(chǎng)推出之前已經(jīng)在中國市場(chǎng)上市的筆記本、平板、激光打印機(jī)等辦公產(chǎn)品,并首次推出搭載
Top