日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Go語(yǔ)言切片原生支持并發(fā)嗎?

實(shí)踐檢驗(yàn)真理

  • 不指定索引,動(dòng)態(tài)擴(kuò)容并發(fā)向切片添加數(shù)據(jù)。
func concurrentAppendSliceNotForceIndex() {
sl := make([]int, 0)
wg := sync.WaitGroup{}
for index := 0; index < 100; index++{
k := index
wg.Add(1)
go func(num int) {
sl = append(sl, num)
wg.Done()
}(k)
}
wg.Wait()
fmt.Printf("final len(sl)=%d cap(sl)=%d\n", len(sl), cap(sl))
}

通過(guò)打印數(shù)據(jù)發(fā)現(xiàn)每次的結(jié)果都不一致,先不急出結(jié)論,我們?cè)趯?xiě)其他的demo測(cè)試一下:

  • 指定索引,指定容量并發(fā)向切片添加數(shù)據(jù)。
func concurrentAppendSliceForceIndex() {
sl := make([]int, 100)
wg := sync.WaitGroup{}
for index := 0; index < 100; index++{
k := index
wg.Add(1)
go func(num int) {
sl[num] = num
wg.Done()
}(k)
}
wg.Wait()
fmt.Printf("final len(sl)=%d cap(sl)=%d\n", len(sl), cap(sl))
}

通過(guò)結(jié)果我們可以發(fā)現(xiàn)符合我們的預(yù)期,長(zhǎng)度和容量都是100,所以說(shuō)slice支持并發(fā)嗎?

slice支持并發(fā)嗎?

我們都知道切片是對(duì)數(shù)組的抽象,其底層就是數(shù)組,在并發(fā)下寫(xiě)數(shù)據(jù)到相同的索引位會(huì)被覆蓋,并且切片也有自動(dòng)擴(kuò)容的功能,當(dāng)切片要進(jìn)行擴(kuò)容時(shí),就要替換底層的數(shù)組,在切換底層數(shù)組時(shí),多個(gè)goroutine是同時(shí)運(yùn)行的,哪個(gè)goroutine先運(yùn)行是不確定的,不論哪個(gè)goroutine先寫(xiě)入內(nèi)存,肯定就有一次寫(xiě)入會(huì)覆蓋之前的寫(xiě)入,所以在動(dòng)態(tài)擴(kuò)容時(shí)并發(fā)寫(xiě)入數(shù)組是不安全的;

所以當(dāng)別人問(wèn)你slice支持并發(fā)時(shí),你就可以這樣回答它:

當(dāng)指定索引使用切片時(shí),切片是支持并發(fā)讀寫(xiě)索引區(qū)的數(shù)據(jù)的,但是索引區(qū)的數(shù)據(jù)在并發(fā)時(shí)會(huì)被覆蓋的;當(dāng)不指定索引切片時(shí),并且切片動(dòng)態(tài)擴(kuò)容時(shí),并發(fā)場(chǎng)景下擴(kuò)容會(huì)被覆蓋,所以切片是不支持并發(fā)的~。

github上著名的iris框架也曾遇到過(guò)切片動(dòng)態(tài)擴(kuò)容導(dǎo)致webscoket連接數(shù)減少的bug,最終采用sync.map解決了該問(wèn)題。

總結(jié)

針對(duì)上述問(wèn)題,我們可以多種方法來(lái)解決切片并發(fā)安全的問(wèn)題:

  • 加互斥鎖
  • 使用channel串行化操作
  • 使用sync.map代替切片

切片的問(wèn)題還是比較容易解決,針對(duì)不同的場(chǎng)景可以選擇不同的方案進(jìn)行優(yōu)化,你學(xué)會(huì)了嗎?


當(dāng)前標(biāo)題:Go語(yǔ)言切片原生支持并發(fā)嗎?
本文網(wǎng)址:http://www.5511xx.com/article/djeigeh.html