1 回答
TA贡献1770条经验 获得超3个赞
使用互斥锁锁定变量时,将阻止后续的 goroutine 锁定互斥体,因为它尚未解锁。num
因此,第二个goroutine实际上等到第一个完成睡眠(9秒),然后打印数字1。只有在那一刻,第二个 goroutine 可以锁定互斥体并写入变量 ,但第三个 goroutine 还不能访问,所以它再次等待,直到第二个 goroutine 打印数字,依此类推。num
没有互斥体,第一个goroutine的睡眠时间最长,它不会阻止其他人执行和写入,所以它打印了最新的,其他人可以先完成他们的工作,因为睡眠时间更短,完成得更快。num
如果删除睡眠状态,则两种情况下的工作方式相同。
package main
import (
"fmt"
"sync"
"time"
)
var (
dataSendChannel = make(chan int)
rwMutex = new(sync.RWMutex)
)
func main() {
go first(dataSendChannel)
time.Sleep(time.Second * 100)
}
func first(c chan<- int) {
for i := 1; i <= 10; i++ {
go second(dataSendChannel)
c <- i
}
}
func second(c <-chan int) {
rwMutex.Lock()
num := <-c
fmt.Println("[NUM] : ", num)
rwMutex.Unlock()
}
- 1 回答
- 0 关注
- 94 浏览
添加回答
举报