轉(zhuǎn)自個(gè)人博客 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í)行代碼的前提下,腦補(bǔ)一下輸出結(jié)果應(yīng)該是什么。
我再看到這道題時(shí),首先想到輸出應(yīng)該是0 -- 9 依次輸出。 但執(zhí)行后才大跌眼鏡,錯(cuò)的不是一點(diǎn)半點(diǎn)。首先看一下,在我本地執(zhí)行的結(jié)果:
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
意不意外? 驚不驚喜?
為什么會(huì)是這樣的結(jié)果, 再翻閱了google官方出品的golang文檔之后,總算搞到了一些頭緒。
并發(fā)不等于并行
golang的核心開發(fā)人員Rob Pike專門提到了這個(gè)話題(有興趣可以看這個(gè)視頻或者看原文PPT)
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26