gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

一文聊聊Go語言中資源競爭問題

一文聊聊Go語言中資源競爭問題

我們都知道,在并發編程中,線程安全是非常重要的。接下來我們就假定一個場景,復現一下線程不安全的情況,再聊聊如何在Go中解決

場景

我們現在需要對1~100求他們的階乘,并將結果放到一個map中

1! = 1 = 1 2! = 1 * 2 = 2 3! = 1 * 2 * 3 = 6 4! = 1 * 2 * 3 * 4 = 24 5! = 1 * 2 * 3 * 4 * 5 = 120 ... {     1: 1     2: 2     3: 6     4: 24     5: 120     ... }
登錄后復制

代碼實現

var factorialMap = make(map[int]int)  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {         result *= i     }     factorialMap[n] = result }  func main() {     for i := 1; i < 10; i++ {         Factorial(i)     }     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

一文聊聊Go語言中資源競爭問題上述代碼執行結果其實是沒問題的,為什么會出現亂序呢?因為這是go語言中map其實就是亂序的,按照我們的理解,先存的先出,但是不好意思,Golang的map不是這樣的。 上面執行也沒什么問題啊,細心的同學可能發現了,這個版本的代碼并沒有用上并發,對吧。好接下來我們繼續改進

并發實現

var factorialMap = make(map[int]int)  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {         result *= i     }     factorialMap[n] = result }  func main() {     for i := 1; i < 10; i++ {         go Factorial(i)     }     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

一文聊聊Go語言中資源競爭問題我們可以發現,并發版就是在調用計算階乘函數的前面加上了一個go而已。不要小看這個go,扯遠了,當然大家知道這是go語言中開啟一個協程的關鍵字即可。

執行結果就是,控制臺啥都沒輸出,這是因為主協程和子協程之間的執行關系,下面我們畫圖理解

一文聊聊Go語言中資源競爭問題從上圖中我們可以發現,主協程執行的時間短(表現在比較短),子協程執行時間比較長(表現在比較長) 我們一定要記住,子協程是相對于當前的主協程來說的,如果主協程不存在了,那就沒有子協程了

所以上面代碼啥都沒輸出就是因為,主協程已經執行完了,但是子協程還沒做完,那子協程都沒做完,factorialMap中能有東西嗎?

主等子

這就引出我們第一個問題,主協程如何等待子協程執行完再退出程序。我們現在用一個最簡單,最容易想到的做法

var factorialMap = make(map[int]int)  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {         result *= i     }     factorialMap[n] = result }  func main() {     for i := 1; i < 100; i++ {         go Factorial(i)     }     time.Sleep(time.Second * 3)     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

一文聊聊Go語言中資源競爭問題當并發數比較小的時候,這個問題可能不會出現,一旦并發數變大,問題就立馬出現了

圖中的執行結果是并發map寫入錯誤為什么會出現這個問題,我們假設100個人往一個籃子里放水果,很容易。但是100個人從一個籃子里拿水果,那就會出問題,首先,籃子里的水果不一定夠100個,其二每個人都想先拿,必然會引起爭搶。

問題一優化

針對上面的問題,我們引入全局鎖的概念。這就有點像我們上廁所,100個人都想上廁所,但廁所只有1個,誰先搶到了誰先上,并且這個人還有給廁所上鎖,防止其他人進來

一文聊聊Go語言中資源競爭問題

var factorialMap = make(map[int]int) var lock sync.Mutex  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {             result *= i     }     // defer 不好理解     // defer func(){     // 	lock.Unlock() // 執行完解鎖     // }()     lock.Lock() // 執行時上鎖     factorialMap[n] = result     lock.Unlock() // 執行后解鎖 }  func main() {     for i := 1; i < 100; i++ {         go Factorial(i)     }     time.Sleep(time.Second * 3)     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

一文聊聊Go語言中資源競爭問題執行結果有0可能是數據類型存不下了導致的,這個大家不用關心

一文聊聊Go語言中資源競爭問題這樣我們就解決了資源競爭的問題了。但其實還有一個問題,就是我們在主協程中還是必須手動等待,這要非常不好,那如果子協程3秒內解決不了怎么辦?

問題二優化

這個問題是我們不想在主協程中手動等待子協程,換句話說是我們不想直接在代碼中寫明要等待多長時間

這里我們就引入了WaitGroup

var factorialMap = make(map[int]int) var lock sync.Mutex var wg sync.WaitGroup  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {         result *= i     }     lock.Lock() // 執行時上鎖     factorialMap[n] = result     lock.Unlock() // 執行后解鎖     wg.Done() }  func main() {     for i := 1; i < 100; i++ {         wg.Add(1)         go Factorial(i)     }     wg.Wait()     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

WaitGroup的內部原理大家自己細扣,我這就不講了 總結來說就是WaitGroup是一個籃子,每開一個協程,就往籃子中加一個標識(Add函數),每執行完一個協程,就從籃子中減去一個標識(Done函數),最后查看籃子中,如果是空的,就表示協程執行完了(Wait函數)

【推薦學習:go視頻教程】

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
亚洲色图都市激情| 国产又黄又爽免费视频| 免费黄色日本网站| 特色特色大片在线| av动漫免费看| 日本三级免费网站| 中国丰满人妻videoshd| www.国产区| 欧美xxxxxbbbbb| 国产精品无码免费专区午夜| www插插插无码免费视频网站| 国产女主播av| 亚洲熟妇av一区二区三区| 国产二级片在线观看| 国产av人人夜夜澡人人爽麻豆| 男人的天堂avav| 亚洲一区二区图片| 成人午夜视频在线观看免费| www.久久com| 亚洲 欧美 日韩系列| 老子影院午夜伦不卡大全| 欧美激情国内自拍| 欧美这里只有精品| 亚洲成人福利在线观看| 激情伊人五月天| 一区二区三区四区免费观看| 日本久久精品一区二区| 国产精品秘入口18禁麻豆免会员| 九一精品久久久| 精品久久久久久久无码| 国产三级日本三级在线播放| 日日噜噜夜夜狠狠久久丁香五月| 九九九在线观看视频| 久久久久久久久久伊人| 亚洲精品手机在线观看| 成人一级片网站| 日韩精品xxxx| 午夜免费一区二区| 狠狠热免费视频| 国产原创精品在线| 无码毛片aaa在线| 国产成人一区二区三区别| 成人在线视频一区二区三区| 日韩a级黄色片| 精品一区二区中文字幕| 99热一区二区| 中文字幕人妻熟女人妻洋洋| 99视频在线免费播放| 国产一二三区av| 黄色片网址在线观看| 欧美久久久久久久久久久久久 | 日批视频在线免费看| 亚洲免费黄色网| 成年人午夜视频在线观看| 99视频在线视频| 国产制服91一区二区三区制服| 99久久99久久精品| 波多结衣在线观看| 色综合久久久久无码专区| 成年网站在线播放| 香港三级韩国三级日本三级| 熟妇熟女乱妇乱女网站| 爱情岛论坛亚洲首页入口章节| 99热久久这里只有精品| 在线播放免费视频| 99精品一区二区三区的区别| 26uuu成人| 手机在线观看日韩av| 久久久99精品视频| 玖玖精品在线视频| 免费日韩在线观看| 岛国大片在线播放| 免费的一级黄色片| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 日韩精品综合在线| 日韩a∨精品日韩在线观看| 日韩欧美国产综合在线| 久久久久久久片| 国产一区一区三区| 日韩一级在线免费观看| 国产毛片久久久久久| 日本www在线播放| 日韩视频在线免费播放| 亚洲熟妇无码一区二区三区导航| 欧美视频免费播放| 天天色天天干天天色| 在线a免费观看| 日韩肉感妇bbwbbwbbw| 亚洲综合20p| 美女福利视频在线| 黄色录像特级片| 午夜两性免费视频| 国产精品网站免费| www插插插无码视频网站| 日本黄大片一区二区三区| 欧美日韩视频免费| 日本一本在线视频| 手机福利在线视频| 天天成人综合网| 欧美大片免费播放| 水蜜桃在线免费观看| 蜜桃视频成人在线观看| 人人干人人视频| 激情久久综合网| 婷婷中文字幕在线观看| 免费人成在线观看视频播放| 公共露出暴露狂另类av| 欧美日韩视频免费在线观看| 欧美女同在线观看| 99sesese| 国产精品久久久久久久99| 欧美日韩在线免费观看视频| caoporm在线视频| 男人日女人视频网站| 青青青青草视频| 久久九九国产视频| 色婷婷综合在线观看| 黄色特一级视频| 午夜免费高清视频| 隔壁人妻偷人bd中字| 色天使在线观看| xxxx18hd亚洲hd捆绑| 午夜国产一区二区三区| 成年人看的毛片| 日本大胆人体视频| 污版视频在线观看| www.中文字幕在线| 久久综合九色综合88i| 欧美中文字幕在线观看视频| 色一情一区二区三区| 久久精品免费一区二区| 色婷婷激情视频| 999精品网站| 成人小视频在线看| 欧美婷婷精品激情| 亚洲精品在线网址| 欧美xxxxxbbbbb| 可以在线看黄的网站| 欧美视频国产视频| 成年人黄色片视频| 国产精品宾馆在线精品酒店| 久久亚洲a v| 亚洲 欧美 日韩 国产综合 在线| 日本免费黄色小视频| 国产精品一二三在线观看| 国产午夜精品视频一区二区三区| 国产欧美自拍视频| 欧美私人情侣网站| 最新av在线免费观看| 亚洲一区二区三区av无码| www.av片| 黄色a级三级三级三级| 九九爱精品视频| 国产免费内射又粗又爽密桃视频| 国产精品va无码一区二区| 国产九九热视频| 五月天婷婷影视| 日本女人高潮视频| 牛夜精品久久久久久久| 日本老太婆做爰视频| 成人一区二区三| 国产3p露脸普通话对白| 日韩高清第一页| www.欧美日本| 黄色一级片国产| 国产美女视频免费看| 北条麻妃在线观看| 黄色成人在线免费观看| 97免费视频观看| 奇米影视亚洲色图| 亚洲人成无码网站久久99热国产| 亚洲黄色a v| 亚洲女人在线观看| 国产乱叫456| 免费看黄在线看| 欧美成人xxxxx| 五月婷婷之婷婷| 国产福利片一区二区| 国产又粗又猛又爽又黄的网站| 三上悠亚免费在线观看| 黄色a级在线观看| 国产一线二线三线女| 成年人小视频网站| 色婷婷777777仙踪林| 青青草av网站| 欧美国产日韩在线视频| 精品国偷自产一区二区三区| 免费看污污网站| 亚洲色婷婷久久精品av蜜桃| 六月丁香婷婷激情| 男女啪啪免费观看| 999热精品视频| 鲁一鲁一鲁一鲁一av| 日韩视频免费在线播放| 男女激情无遮挡| 日本人妻伦在线中文字幕| 911av视频| 日本网站在线看| 日韩av.com| 黄色一级片国产|