1. 程式人生 > >go語言面試題:goroutine、waitgroup、mutex

go語言面試題:goroutine、waitgroup、mutex

判斷程式的執行結果,並解釋原因

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的最大值。