说明:
互斥锁用来保证在任一时刻,只能有一个例程访问某对象。 Mutex 的初始值为解锁状态。 Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。 Mutex 可以安全的在多个例程中并行使用。
sync.Mutex 源码解读
// Locker 接口包装了基本的 Lock 和 UnLock 方法,用于加锁和解锁。
type Locker interface {
Lock()
Unlock()
}
// Lock 用于锁住 m,如果 m 已经被加锁,则 Lock 将被阻塞,直到 m 被解锁。
func (m *Mutex) Lock()
// Unlock 用于解锁 m,如果 m 未加锁,则该操作会引发 panic。
func (m *Mutex) Unlock()
demo
package main
import (
"fmt"
"sync"
"time"
)
type Work struct {
sync.Mutex
}
func main() {
work := Work{}
done := make(chan int)
for i := 0; i < 10; i++ {
go func(i int) {
work.Lock()
defer work.Unlock()
time.Sleep(1 * time.Second)
done <- i
}(i)
}
for i := 0; i < 10; i++ {
n := <-done
fmt.Println(time.Now().Format("15:04:05"), n)
}
}
output
liqiongtao:test liqiongtao$ go run main.go
18:23:10 1
18:23:11 2
18:23:12 3
18:23:13 0
18:23:14 9
18:23:15 4
18:23:16 5
18:23:17 6
18:23:18 7
18:23:19 8