sync.Mutex 是一个互斥锁,用来保证在任一时刻只能有一个协程执行某段代码。
特性
- Mutex 的零值为解锁状态;
- Mutex 与协程无关,可以安全的由不同的协程加锁、解锁;
- 对锁定状态下的 Mutex 进行 Lock() 操作会阻塞当前 goroutine,直到 Mutex 被解锁;
- 对未加锁的 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()
for i := 1; i <= 3; i++ {
wait.Add(1)
go func(index int) {
fmt.Println("not lock: ", index)
user.Lock()
defer user.Unlock()
fmt.Println("lock: ", index)
time.Sleep(time.Millisecond)
fmt.Println("unlock: ", index)
wait.Done()
}(i)
}
time.Sleep(time.Millisecond)
fmt.Println("unlocked")
user.Unlock()
wait.Wait()
} ```