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 關注
- 113 瀏覽
添加回答
舉報