为什么for外面的lock没有影响到for里面的lock?
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var mutex sync.Mutex
wait := sync.WaitGroup{}
fmt.Println("Locked")
mutex.Lock() // <---- 这个外面的锁,为什么锁住for里面的锁?
for i := 1; i <= 3; i++ {
wait.Add(1)
go func(i int) {
fmt.Println("Not lock:", i)
mutex.Lock() // <----- 这个为什么没被影响
fmt.Println("Lock:", i)
time.Sleep(time.Second)
fmt.Println("Unlock:", i)
mutex.Unlock()
defer wait.Done()
}(i)
}
time.Sleep(time.Second)
fmt.Println("Unlocked")
mutex.Unlock()
wait.Wait()
}
输出:
Locked
Not lock: 1
Not lock: 2
Not lock: 3
Unlocked
Lock: 1
Unlock: 1
Lock: 2
Unlock: 2
Lock: 3
Unlock: 3
不知道怎么得出 goroutine 内的 mutex 没被影响这个结论的?
从输出很明显的看到,所有的 "Not lock: N" 打印完了之后,紧接着就打印了 “Unlocked”, 这说明 3 个 goroutine 都执行了一部分代码,M 就调度到了 main goroutine 执行,这个切换不就是 mutex 导致三个 goroutine 陷入阻塞,被迫让出执行权嘛。
后面
Lock N
和Unlock N
成对出现,而不是交替,也是同理。