[Golang]同步工具-sync包的Mutex-心智图总结

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/


<<:  【图解演算法教学】还在用古老的二元搜寻法?是时候跟上「Hash Search」的车尾灯了!

>>:  Vue ⑅:要开始Vue之前要先做的事

Day 24:「Switch 也要换游戏片啦~」- Slot 插槽

不知道大家有没有买 Switch 呢? 虽然兔兔没有 Switch, 但我知道有游戏片都不便宜呀!...

Day9 职训(机器学习与资料分析工程师培训班): python、 php结合highchart

上午: Python程序设计 老师此次课程教学for回圈, List comprehension, ...

文章内搜寻,doc docx txt 子目录下所有档 (Python)

运用:os.walk递回搜寻,档案内文 前天发的错误版本(已删除),掉入os.walk天坑,和pyt...

[Python]专题P01─台湾春节国道预估塞车时间准不准?

Hi! 大家好久不见,我是Eric。真的是时隔多日,我们的网站终於又更新啦!这次要练习运用Pytho...

【Day5】不是八卦阵的有序集合:阵列

阵列算是一种「特殊物件」,可以在里面放入0到多个元素,里面的元素可以是字串、数字等原始型别资料、也...