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一区二区
日本一极黄色片| 天天插天天操天天射| 色综合色综合色综合色综合| 日本a在线免费观看| 777一区二区| 在线观看免费不卡av| 亚欧在线免费观看| 女性女同性aⅴ免费观女性恋| 欧美日韩午夜爽爽| 免费看av软件| 裸体裸乳免费看| 国风产精品一区二区| 一本之道在线视频| 免费看av软件| www.69av| 亚洲国产一二三精品无码| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 亚洲欧美一区二区三区不卡| 天天爽夜夜爽一区二区三区| 午夜国产一区二区三区| 午夜久久福利视频| 警花观音坐莲激情销魂小说| 大陆极品少妇内射aaaaaa| 性做爰过程免费播放| 欧美狂野激情性xxxx在线观| 精品国产一区三区| 久久久久久久久久久视频| 成年人小视频网站| 182午夜视频| 国产九九九九九| 久热精品在线播放| 日韩精品免费一区| 国产熟人av一二三区| 91极品尤物在线播放国产| 天堂在线精品视频| 国产精品一区二区免费在线观看| 国产精品视频黄色| 免费看欧美一级片| 看欧美ab黄色大片视频免费| 一区二区三区国产好的精华液| 黄色a级片免费看| 久久综合九色综合88i| 夜夜爽久久精品91| 日韩av在线播放不卡| 欧美精品第三页| 男人天堂网站在线| 成年网站免费在线观看| 欧美精品自拍视频| 日本特级黄色大片| 50路60路老熟妇啪啪| 91精品国产毛片武则天| 手机在线免费观看毛片| 国产日韩亚洲欧美在线| 久热精品在线观看视频| 国产婷婷一区二区三区| 亚洲黄色av片| 三级视频中文字幕| 欧美大黑帍在线播放| 日本免费色视频| 国产a级片免费观看| 91好吊色国产欧美日韩在线| japanese在线播放| 欧美一级黄色录像片| 污污的网站18| 一区二区成人网| 婷婷激情四射五月天| 欧美日韩性生活片| 日本一道在线观看| 浴室偷拍美女洗澡456在线| 黄色一级片免费的| 亚洲免费黄色网| 亚洲高清视频免费| 永久免费黄色片| 中文字幕第三区| 手机成人av在线| 强伦女教师2:伦理在线观看| 日日干日日操日日射| 污污网站在线观看视频| 欧美午夜精品理论片| 色乱码一区二区三区熟女| 三年中文高清在线观看第6集| 亚洲欧美日韩网站| 成人免费a级片| 欧美国产亚洲一区| 91香蕉视频污版| 在线免费黄色小视频| 欧洲金发美女大战黑人| 男人插女人视频在线观看| 2018国产在线| 午夜激情av在线| 成人在线观看毛片| 毛片在线播放视频| 妺妺窝人体色www在线观看| gogogo高清免费观看在线视频| 在线视频观看91| 欧美乱大交xxxxx潮喷l头像| 久草资源站在线观看| av在线免费看片| 国自产拍偷拍精品啪啪一区二区| 青青青在线播放| 亚洲欧美一二三| 手机看片福利盒子久久| 国产欧美综合一区| 久久久久久久久久福利| 懂色av粉嫩av蜜臀av| 国产免费一区二区三区视频| 天天影视色综合| 99久久久无码国产精品6| 特级西西444www| 大香煮伊手机一区| 亚洲精品天堂成人片av在线播放| 各处沟厕大尺度偷拍女厕嘘嘘| 网站在线你懂的| 国产一区二区在线视频播放| 污污视频在线免费| 中文字幕在线观看第三页| 狠狠精品干练久久久无码中文字幕| 看欧美ab黄色大片视频免费| 亚洲国产成人精品无码区99| 亚洲黄色片免费| 久久久久国产精品熟女影院| 国产乱人伦精品一区二区三区| 国产无遮挡猛进猛出免费软件| 成年人网站大全| 免费毛片网站在线观看| 日本xxx免费| 国产三级生活片| 亚洲欧美另类动漫| 六月丁香婷婷在线| 精品少妇人妻av免费久久洗澡| 影音先锋成人资源网站| 三级av免费看| 欧美性受xxxx黒人xyx性爽| 一道本视频在线观看| 黄色一级大片在线观看| 欧美在线观看www| 一本大道熟女人妻中文字幕在线| 日韩av在线播放不卡| 精品无码av无码免费专区| 熟女视频一区二区三区| 亚洲欧美日韩一二三区| 色婷婷狠狠18| 精品综合久久久久| 自拍一级黄色片| 成人黄色片免费| 妞干网视频在线观看| 免费看欧美黑人毛片| 大荫蒂性生交片| 凹凸国产熟女精品视频| 欧美伦理视频在线观看| 99sesese| 国产成人艳妇aa视频在线| 亚洲美免无码中文字幕在线| 日韩av资源在线| 91国产精品视频在线观看| 久久6免费视频| 久久这里只有精品8| 日韩精品一区二区三区色欲av| 91香蕉视频污版| 成人短视频在线观看免费| 精品久久久久久久免费人妻| 亚洲欧美视频二区| 国产成人在线小视频| 欧美 激情 在线| 国产欧美自拍视频| 大肉大捧一进一出好爽视频| 天天操狠狠操夜夜操| 欧美激情亚洲天堂| 天天操天天爱天天爽| 老司机午夜网站| 中文字幕第36页| 9色porny| 一区二区久久精品| 欧美极品欧美精品欧美图片| 三区视频在线观看| 国产精品沙发午睡系列| 欧洲在线免费视频| 99视频精品免费| 亚洲精品无码国产| 91日韩精品视频| 久久婷婷国产91天堂综合精品| 免费日韩在线观看| 午夜在线观看av| 免费看的黄色大片| 水蜜桃在线免费观看| 天堂网在线免费观看| 亚洲精品久久久久久久蜜桃臀| 手机av在线免费| 无码日韩人妻精品久久蜜桃| 人妻激情另类乱人伦人妻| 日韩视频在线观看一区二区三区| 国产激情在线观看视频| 免费av不卡在线| 精品人妻人人做人人爽| 涩多多在线观看| 天堂一区在线观看| 天天操天天爱天天爽| 国产福利一区视频| av免费播放网址| 亚洲国产精品久久久久婷蜜芽 |