久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久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號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日本aⅴ亚洲精品中文乱码| 青青草视频一区| 国产亚洲一区二区三区啪| 中文字幕一区日韩精品| 狠狠色综合网| 国产精品毛片| 亚洲人成毛片在线播放女女| 国产亚洲激情| 婷婷精品在线| 久久av免费| 91免费精品| 亚洲91视频| 老色鬼久久亚洲一区二区| 日本一区福利在线| 美女毛片一区二区三区四区最新中文字幕亚洲 | 色婷婷亚洲mv天堂mv在影片| 岛国av在线播放| 丝袜av一区| 免费看黄色91| 久久99久久人婷婷精品综合| 正在播放日韩精品| 五月天综合网站| 亚州av日韩av| 成人在线免费观看91| 午夜精品成人av| 国产亚洲亚洲| 国产精品一国产精品k频道56| 麻豆一区二区三区| 久久久久久美女精品| 亚洲三级国产| 麻豆视频一区| 一区在线免费| 国产精品一区亚洲| 亚洲成人国产| 欧美一区二区三区久久精品| 麻豆国产精品777777在线| 欧美成人精品| 国产欧美高清视频在线| 日韩高清成人| 欧美日韩一区二区三区不卡视频| 日韩理论片av| 日韩av一区二区三区| 青青青免费在线视频| 亚洲午夜久久| 一区二区三区四区日本视频| 蜜臀久久久99精品久久久久久| 久久精品毛片| 亚洲人www| 久久蜜桃av| 欧美国产三级| 中文精品电影| 久久久夜精品| 捆绑调教美女网站视频一区| 午夜宅男久久久| 亚洲精品**中文毛片| 欧美精品影院| 99riav国产精品| 麻豆国产精品视频| 免费精品视频最新在线| 亚洲va中文在线播放免费| 欧美亚洲二区| 亚洲丝袜美腿一区| 婷婷久久一区| 日韩精品91| 国产精品1区在线| 蜜桃视频一区二区三区| 久久天堂精品| 久久久久久色 | 日韩专区视频网站| 99久久精品国产亚洲精品| 国产精品麻豆成人av电影艾秋 | 国产传媒在线| 久久精品资源| 日本午夜精品久久久| 好看的av在线不卡观看| 三级精品视频| 中文字幕一区久| 精品国内亚洲2022精品成人| 日韩亚洲精品在线观看| 亚洲一区不卡| 精品日韩一区| 日韩精品免费视频一区二区三区| 成人亚洲一区| 国产免费播放一区二区| 亚洲黄页一区| 国产成人77亚洲精品www| 久久一区国产| 欧美久久精品| 亚洲精品日韩久久| 影音国产精品| 欧美手机在线| 中文字幕在线看片| 首页国产精品| 欧美激情网址| 青青伊人久久| 亚洲精品亚洲人成在线观看| 天堂中文在线播放| 欧美成人一二区| 日韩精品亚洲aⅴ在线影院| 99国产精品视频免费观看一公开| 在线日韩电影| 久久国产欧美| а√天堂8资源中文在线| 国产精品一区高清| 日本在线成人| 综合激情一区| 亚洲在线成人| 激情久久久久久| 精品久久网站| 日韩精品中文字幕第1页| 色婷婷色综合| 国产激情综合| 久久gogo国模啪啪裸体| 日本精品一区二区三区在线观看视频 | 91精品在线免费视频| 亚洲开心激情| 亚洲免费专区| 日韩精品导航| 国产调教精品| 国产欧美日韩在线观看视频 | 亚洲二区视频| 亚洲天堂av影院| 桃色一区二区| 欧美成人基地 | 亚洲午夜免费| 综合一区av| 一区二区三区四区日韩| 国产精品xxxav免费视频| 国产精品二区影院| 精品亚洲免a| 亚洲黄色网址| 免费精品国产的网站免费观看| 精品一区免费| 亚洲不卡av不卡一区二区| 六月婷婷一区| 国产午夜精品一区二区三区欧美| 野花国产精品入口| 蜜桃久久av一区| 欧美一区成人| 久久只有精品| 国产精品yjizz视频网| 99精品在线观看| 日韩不卡一区二区三区| 久久gogo国模啪啪裸体| 国产精品原创| 国产精品三上| 国产亚洲高清一区| 高清日韩欧美| 99香蕉国产精品偷在线观看 | 美女国产一区| 日韩国产在线一| 国产一区一一区高清不卡| 成人啊v在线| 一区二区高清| 美日韩精品视频| 高清日韩中文字幕| 黄页网站一区| 日韩超碰人人爽人人做人人添| 美女精品一区二区| 久久中文字幕av| 亚洲精品亚洲人成在线观看| 国产精品亚洲片在线播放| 国产精品白浆| 免费观看在线色综合| 91成人在线精品视频| 色偷偷偷在线视频播放| 麻豆亚洲精品| 精品中文在线| 99香蕉国产精品偷在线观看| 国产精品色婷婷在线观看| 亚洲精品国产偷自在线观看| 国产亚洲精品美女久久| 欧美成人基地 | 国产精品人人爽人人做我的可爱| 欧美日韩亚洲一区三区| 伊人久久高清| 日韩精品视频网站| 日韩欧美午夜| 日韩精品高清不卡| 亚洲三级欧美| 91在线成人| 久久国产精品99国产| 不卡专区在线| 啪啪亚洲精品| 蜜桃视频欧美| 久久久久亚洲精品中文字幕| 视频一区在线视频| 国产精品a级| 久久中文字幕av一区二区不卡| 美女尤物国产一区| 一区二区三区四区在线观看国产日韩| 国产不卡一区| 日本免费新一区视频| 欧美日韩在线观看视频小说| 久久不见久久见免费视频7 | 亚洲经典在线| 成人片免费看| 国产亚洲一区二区三区啪| 韩日一区二区三区| 日本黄色精品|