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

1. Mutex又称互斥锁。为什么需要保护共享资源?
数据在goroutine之间共享,就有可能会出现争用或者冲突的状况。这种状况,会破坏共享数据的一致性,也被称为race condition。
因此,需要对共享资源,设定访问权限。想要访问时,就要申请访问权限,访问结束时,必须归还对该资源的访问权限。

2. sync.Mutex有两个方法,分别是Lock()、Unlock()。
以下是程式範例:

package mainimport (  "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. 不要在多个函数之间直接传递互斥锁

http://img2.58codes.com/2024/201317282E2O5CimAg.png

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


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章