欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言中sync.Mutex的使用方法

 更新時(shí)間:2023年03月06日 10:59:06   作者:水淹萌龍  
本文主要介紹了golang中sync.Mutex的實(shí)現(xiàn)方法,mutex主要有兩個(gè) method:Lock()和Unlock(),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

背景

多個(gè)協(xié)程操作中經(jīng)常出現(xiàn)臟讀寫的情況,這種情況下需要使用互斥鎖,保證在對協(xié)程共享區(qū)域操作的原子性。

如下示例:

啟動了 100個(gè)協(xié)程,每個(gè)協(xié)程累加 100 次,在沒有臟讀寫的情況下,最后結(jié)果應(yīng)該是 100 * 100 = 10000

package main
import (
	"fmt"
	"sync"
)
func main() {
   var count = 0
   var wg  sync.WaitGroup
   wg.Add(100)
   for i :=0; i< 100; i++ {
      go func(){
         defer wg.Done()
         for j := 0; j< 100; j ++ {
            count ++
         }
      }()
   }
   wg.Wait()
   fmt.Println(count)
}

但是實(shí)際結(jié)果一直小于 10000

互斥鎖

count ++ 操作, 分為三個(gè)步驟

在協(xié)程的共享區(qū)域取出 count 當(dāng)前值

當(dāng)前值加一

加一后的值寫回協(xié)程共享區(qū)域

這時(shí)需要使用互斥鎖, 來保證對 count++ 的三個(gè)操作過程中沒有其他協(xié)程進(jìn)行讀寫。

Go的Sync 包提供了Mutex, 讀寫互斥的鎖, 來保證只有一個(gè)協(xié)程對數(shù)據(jù)進(jìn)行讀寫操作。 以保證 count++操作的原子性

如下示例:

package main
import (
	"fmt"
	"sync"
)
func main() {
   var count = 0
   // 聲明Mutex變量
   var mu sync.Mutex
   var wg  sync.WaitGroup
   wg.Add(100)
   for i :=0; i< 100; i++ {
      go func(){
         defer wg.Done()
         for j := 0; j< 100; j ++ {
            // 添加鎖
            mu.Lock()
            count ++
            // 解鎖
            mu.Unlock()
         }
      }()
   }
   wg.Wait()
   fmt.Println(count)
}

mu.Lock()mu.Unlock() 之間的代碼可以保證在操作只會被一個(gè)協(xié)程執(zhí)行。這樣執(zhí)行結(jié)果就是 10000 了

注意

mu.Lock()mu.Unlock() 必須成對出現(xiàn),在忘掉 Unlock 的情況下,鎖獲取后永遠(yuǎn)不會得到釋放,其他 的線程/協(xié)程會永遠(yuǎn)處于阻塞狀態(tài),永遠(yuǎn)獲取不到鎖,在忘掉 Lock 的情況下,直接 Unlock 一個(gè)未加鎖的 Mutex,會導(dǎo)致程序 panic。

到此這篇關(guān)于Go語言中sync.Mutex的使用方法的文章就介紹到這了,更多相關(guān)Go sync.Mutex內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang?beego框架環(huán)境搭建過程

    golang?beego框架環(huán)境搭建過程

    這篇文章主要為大家介紹了golang?beego框架環(huán)境搭建的過程腳本,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang操作MySql數(shù)據(jù)庫的完整步驟記錄

    Golang操作MySql數(shù)據(jù)庫的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于Golang操作MySql數(shù)據(jù)庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • goFrame的隊(duì)列g(shù)queue對比channel使用詳解

    goFrame的隊(duì)列g(shù)queue對比channel使用詳解

    這篇文章主要為大家介紹了goFrame的gqueue對比channel使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 淺談Golang如何使用Viper進(jìn)行配置管理

    淺談Golang如何使用Viper進(jìn)行配置管理

    在Golang生態(tài)中,Viper是一個(gè)不錯的開源配置管理框架,這篇文章主要為大家介紹了Golang如何使用Viper進(jìn)行配置管理,需要的可以參考一下
    2023-06-06
  • go Antlr重構(gòu)腳本解釋器實(shí)現(xiàn)示例

    go Antlr重構(gòu)腳本解釋器實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了go Antlr重構(gòu)腳本解釋器實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang實(shí)現(xiàn)Redis事務(wù)深入探究

    Golang實(shí)現(xiàn)Redis事務(wù)深入探究

    這篇文章主要介紹了Golang實(shí)現(xiàn)Redis事務(wù)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語言內(nèi)置包的使用

    Go語言內(nèi)置包的使用

    本文主要介紹了Go語言內(nèi)置包的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 一文教你打造一個(gè)簡易的Golang日志庫

    一文教你打造一個(gè)簡易的Golang日志庫

    這篇文章主要為大家詳細(xì)介紹了如何使用不超過130行的代碼,通過一系列g(shù)olang的特性,來打造一個(gè)簡易的golang日志庫,感興趣的小伙伴可以了解一下
    2023-06-06
  • Golang?編寫Tcp服務(wù)器的解決方案

    Golang?編寫Tcp服務(wù)器的解決方案

    Golang?作為廣泛用于服務(wù)端和云計(jì)算領(lǐng)域的編程語言,tcp?socket?是其中至關(guān)重要的功能,這篇文章給大家介紹Golang?開發(fā)?Tcp?服務(wù)器及拆包粘包、優(yōu)雅關(guān)閉的解決方案,感興趣的朋友一起看看吧
    2022-10-10
  • Go語言中JWT的創(chuàng)建和解析操作詳解

    Go語言中JWT的創(chuàng)建和解析操作詳解

    JWT的全名是Json web token,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn),這篇文章主要介紹了在Go語言中JWT的創(chuàng)建和解析操作,感興趣的同學(xué)可以參考下文
    2023-05-05

最新評論