sync.Mutex 是一个互斥锁,用来保证在任一时刻只能有一个协程执行某段代码。

特性

  1. Mutex 的零值为解锁状态;
  2. Mutex 与协程无关,可以安全的由不同的协程加锁、解锁;
  3. 对锁定状态下的 Mutex 进行 Lock() 操作会阻塞当前 goroutine,直到 Mutex 被解锁;
  4. 对未加锁的 Mutex 进行 Unlock() 操作会引发 panic 异常

    Demo

    ```go package main

import ( “fmt” “sync” “time” )

type User struct { sync.Mutex }

func main() { user := &User{} wait := sync.WaitGroup{} fmt.Println(“Locked”) user.Lock()

  1. for i := 1; i <= 3; i++ {
  2. wait.Add(1)
  3. go func(index int) {
  4. fmt.Println("not lock: ", index)
  5. user.Lock()
  6. defer user.Unlock()
  7. fmt.Println("lock: ", index)
  8. time.Sleep(time.Millisecond)
  9. fmt.Println("unlock: ", index)
  10. wait.Done()
  11. }(i)
  12. }
  13. time.Sleep(time.Millisecond)
  14. fmt.Println("unlocked")
  15. user.Unlock()
  16. wait.Wait()

} ``` image.png