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

Go語(yǔ)言中sync.Mutex的使用方法

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

背景

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

如下示例:

啟動(dòng)了 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í)需要使用互斥鎖, 來保證對(duì) count++ 的三個(gè)操作過程中沒有其他協(xié)程進(jìn)行讀寫。

Go的Sync 包提供了Mutex, 讀寫互斥的鎖, 來保證只有一個(gè)協(xié)程對(duì)數(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() 之間的代碼可以保證在操作只會(huì)被一個(gè)協(xié)程執(zhí)行。這樣執(zhí)行結(jié)果就是 10000 了

注意

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

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

相關(guān)文章

  • Go數(shù)組與切片輕松掌握

    Go數(shù)組與切片輕松掌握

    在Java的核心庫(kù)中,集合框架可謂鼎鼎大名:Array、List、Set等等,隨便拎一個(gè)出來都值得開發(fā)者好好學(xué)習(xí)如何使用甚至是背后的設(shè)計(jì)源碼。雖然Go語(yǔ)言沒有如此豐富的容器類型,但也有一些基本的容器供開發(fā)者使用,接下來讓我們認(rèn)識(shí)一下這些容器類型吧
    2022-11-11
  • Go語(yǔ)言中的方法定義用法分析

    Go語(yǔ)言中的方法定義用法分析

    這篇文章主要介紹了Go語(yǔ)言中的方法定義用法,實(shí)例分析了方法的定義及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • go語(yǔ)言程序cpu過高問題排查的方法詳解

    go語(yǔ)言程序cpu過高問題排查的方法詳解

    使用golang進(jìn)行復(fù)雜的組合運(yùn)算,導(dǎo)致CPU占用率非常高,下面這篇文章主要給大家介紹了關(guān)于go語(yǔ)言程序cpu過高問題排查的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Go語(yǔ)言讀取YAML 配置文件的兩種方式分享

    Go語(yǔ)言讀取YAML 配置文件的兩種方式分享

    在日常開發(fā)中,YAML 格式的文件基本上被默認(rèn)為是配置文件,其內(nèi)容因?yàn)榭s進(jìn)帶來的層級(jí)感看起來非常直觀和整潔。本文分享了讀取YAML 配置文件的兩種方式,需要的可以參考一下
    2022-12-12
  • Go語(yǔ)言中的空值(nil)與零值(zerovalue)區(qū)別詳解

    Go語(yǔ)言中的空值(nil)與零值(zerovalue)區(qū)別詳解

    在Go語(yǔ)言中,空值(nil)和零值(zero value)是兩個(gè)不同的概念,它們?cè)谡Z(yǔ)義、使用場(chǎng)景以及實(shí)際的編程實(shí)踐中有著明顯的區(qū)別,理解這兩者的差異對(duì)于編寫清晰、健壯的Go代碼至關(guān)重要,需要的朋友可以參考下
    2024-06-06
  • golang敏感詞過濾的實(shí)現(xiàn)

    golang敏感詞過濾的實(shí)現(xiàn)

    本文主要介紹了golang敏感詞過濾的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 一文帶你吃透Go語(yǔ)言中的原子操作

    一文帶你吃透Go語(yǔ)言中的原子操作

    原子操作是解決并發(fā)編程中共享數(shù)據(jù)訪問問題的一種常見機(jī)制,下面就來和大家深入介紹原子操作的原理、用法以及在解決并發(fā)問題中的應(yīng)用,需要的可以參考一下
    2023-06-06
  • golang根據(jù)URL獲取文件名的示例代碼

    golang根據(jù)URL獲取文件名的示例代碼

    這篇文章主要為大家詳細(xì)介紹了golang根據(jù)URL獲取文件名,文中的示例代碼講解詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Go語(yǔ)言使用slices包輕松實(shí)現(xiàn)排序功能

    Go語(yǔ)言使用slices包輕松實(shí)現(xiàn)排序功能

    在 Go 語(yǔ)言開發(fā)中,對(duì)數(shù)據(jù)進(jìn)行排序是常見的需求,Go 1.18 版本引入的 slices包提供了簡(jiǎn)潔高效的排序解決方案,支持內(nèi)置類型和用戶自定義類型的排序操作,本文將通過具體示例,詳細(xì)介紹如何使用 slices包實(shí)現(xiàn)排序及相關(guān)功能,需要的朋友可以參考下
    2025-05-05
  • Go設(shè)計(jì)模式之策略模式講解和代碼示例

    Go設(shè)計(jì)模式之策略模式講解和代碼示例

    策略是一種行為設(shè)計(jì)模式,?它將一組行為轉(zhuǎn)換為對(duì)象,?并使其在原始上下文對(duì)象內(nèi)部能夠相互替換,本文就將通過代碼示例給大家詳細(xì)的介紹一下Go的策略模式,需要的朋友可以參考下
    2023-08-08

最新評(píng)論