iT邦幫忙

0

[Golang]同步工具-sync包的Mutex-心智圖總結

  • 分享至 

  • xImage
  •  

1. Mutex又稱互斥鎖。為什麼需要保護共享資源?
數據在goroutine之間共享,就有可能會出現爭用或者衝突的狀況。這種狀況,會破壞共享數據的一致性,也被稱為race condition。
因此,需要對共享資源,設定訪問權限。想要訪問時,就要申請訪問權限,訪問結束時,必須歸還對該資源的訪問權限。

2. sync.Mutex有兩個方法,分別是Lock()、Unlock()。
以下是程式範例:

package main

import (
  "fmt"
  "sync"
  "time"
)

func Counter() {
  counter := 0
  for i := 0; i < 5000; i++ {
    go func() {
      counter++
    }()
	}
  time.Sleep(1 * time.Second) //等待thread都執行結束
  fmt.Printf("[Counter]counter = %d\n", counter)
}

func CounterMutex() {
  var mu sync.Mutex
  counter := 0
  for i := 0; i < 5000; i++ {
    go func() {
      defer func() {
        mu.Unlock()
      }()
      mu.Lock()
      counter++
    }()
  }
  time.Sleep(1 * time.Second) //等待thread都執行結束
  fmt.Printf("[CounterMutex]counter = %d\n", counter)
}

func main() {
  go Counter()
  go CounterMutex()
  time.Sleep(2 * time.Second)
}

https://play.golang.org/p/ccEsrLmUz6k

說明:

func Counter()

沒有使用mutex對共享變數進行保護,造成goroutine之間爭奪共享變數,導致counter沒有計數到5000。

func CounterMutex()

使用mutex對共享變數進行保護。當goroutine執行結束前,會進行Unlock,歸還訪問權限。

3. 其它使用互斥鎖的注意事項
a. 不要重複鎖定互斥鎖
b. 不要忘記解鎖互斥鎖,必要時使用defer語句
c. 不要對尚未鎖定或者已解鎖的互斥鎖解鎖
d. 不要在多個函數之間直接傳遞互斥鎖

https://ithelp.ithome.com.tw/upload/images/20201116/201317282E2O5CimAg.png

參考來源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言