Mutex是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。
Mutex类型的锁和线程无关,可以由不同的线程加锁和解锁。
多个goroutine同时等待一个锁时,唤醒的策略是随机的。

  1. func TestCounter(t *testing.T) {
  2. sum := 0
  3. var mut sync.Mutex
  4. for i := 0; i < 5000; i++ {
  5. go func() {
  6. defer mut.Unlock()
  7. mut.Lock()
  8. sum++
  9. }()
  10. }
  11. time.Sleep(time.Second)
  12. t.Log(sum)
  13. }

(1) func (m *Mutex) Lock()

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

(2) func (m *Mutex) Unlock

unlock 解锁 m。
如果在进入 Unlock 时未锁定 m,则会导致运行时错误。

锁定的互斥锁未与特定 goroutine 关联。
允许一个goroutine锁定Mutex,然后安排另一个Goroutine来解锁它。