轉自個人博客 chinazt.cc

先看下面一道面試題:

func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
wg.Add(20)for i := 0; i < 10; i++ {
go func() {
fmt.Println("go routine 1 i: ", i)
wg.Done()
}()
}for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println("go routine 2 i: ", i)
wg.Done()
}(i)

}
wg.Wait()
}

在不執(zhí)行代碼的前提下,腦補一下輸出結果應該是什么。

我再看到這道題時,首先想到輸出應該是0 -- 9 依次輸出。 但執(zhí)行后才大跌眼鏡,錯的不是一點半點。首先看一下,在我本地執(zhí)行的結果:

go routine 2 i: 9go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 2 i: 0go routine 2 i: 1go routine 2 i: 2go routine 2 i: 3go routine 2 i: 4go routine 2 i: 5go routine 2 i: 6go routine 2 i: 7go routine 2 i: 8

意不意外? 驚不驚喜?

為什么會是這樣的結果, 再翻閱了google官方出品的golang文檔之后,總算搞到了一些頭緒。

并發(fā)不等于并行

golang的核心開發(fā)人員Rob Pike專門提到了這個話題(有興趣可以看這個視頻或者看原文PPT)

延伸閱讀

學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網(wǎng)站設計培訓,網(wǎng)站建設培訓學習是年輕人改變自己的最好方式