go語言面試題:goroutine、waitgroup、mutex
阿新 • • 發佈:2018-12-10
判斷程式的執行結果,並解釋原因
package main
import (
"fmt"
"sync"
)
const N = 20
func main() {
wg := sync.WaitGroup{}
mu := sync.Mutex{}
m := make(map[int]int)
wg.Add(N)
for i := 0; i < N; i++ {
go func() {
mu.Lock()
defer wg.Done()
m[i] = i
mu.Unlock()
}()
}
wg.Wait()
fmt.Println(len (m))
fmt.Println(m)
}
執行結果
3
map[12:13 13:13 20:20]
再次執行
5
map[15:16 20:20 10:12 12:12 13:13]
答案:結果不確定。原因:1、當N等於20的時候,主函式裡啟動了20個goroutine,並wait20個goroutine執行,雖然加了鎖,但是這裡的鎖只是對map讀寫的控制,一個goroutine操作map的時候,另一個goroutine不能操作map,而共享資料i,依然不是執行緒安全的。當這裡的N足夠小的時候,map裡常常只有一個鍵值對,而且是i的最大值。