go mutex的一个问题

为什么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

阅读 1.5k
1 个回答

不知道怎么得出 goroutine 内的 mutex 没被影响这个结论的?

从输出很明显的看到,所有的 "Not lock: N" 打印完了之后,紧接着就打印了 “Unlocked”, 这说明 3 个 goroutine 都执行了一部分代码,M 就调度到了 main goroutine 执行,这个切换不就是 mutex 导致三个 goroutine 陷入阻塞,被迫让出执行权嘛。

后面 Lock NUnlock N 成对出现,而不是交替,也是同理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题