Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。

  1. func (m *Mutex) Lock()

Lock 方法锁住 m,如果 m 已经加锁,则阻塞直到 m 解锁。

  1. func (m *Mutex) Unlock()

Unlock 方法解锁 m,如果 m 未加锁会导致运行时错误。

  • 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex
  • 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁
  • 在 Lock() 之前使用 Unlock() 会导致 panic 异常
  • 已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁
  • 在同一个 goroutine 中的 Mutex 解锁之前再次进行加锁,会导致死锁
  • 适用于读写不确定,并且只有一个读或者写的场景
  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. func main() {
  8. var mutex sync.Mutex
  9. wait := sync.WaitGroup{}
  10. fmt.Println("Locked")
  11. mutex.Lock()
  12. for i := 1; i <= 3; i++ {
  13. wait.Add(1)
  14. go func(i int) {
  15. fmt.Println("Not lock:", i)
  16. mutex.Lock()
  17. fmt.Println("Lock:", i)
  18. time.Sleep(time.Second)
  19. fmt.Println("Unlock:", i)
  20. mutex.Unlock()
  21. defer wait.Done()
  22. }(i)
  23. }
  24. time.Sleep(time.Second)
  25. fmt.Println("Unlocked")
  26. mutex.Unlock()
  27. wait.Wait()
  28. }

运行结果:

  1. Locked
  2. Not lock: 1
  3. Not lock: 2
  4. Not lock: 3
  5. Unlocked
  6. Lock: 1
  7. Unlock: 1
  8. Lock: 2
  9. Unlock: 2
  10. Lock: 3
  11. Unlock: 3

个人博客同步地址:
https://shockerli.net/post/golang-pkg-mutex/

版权声明:本文为shockerli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/shockerli/p/golang-pkg-mutex.html