golang Slice和Map併發安全問題

2021-10-10 18:11:38 字數 1361 閱讀 8367

golang slice和map併發安全問題

多個goroutine對同乙個slice進行寫是不安全的。

func main() 

for i := 0; i < 10000; i++ (i)

}time.sleep(2 * time.second)

for i, v := range s

}

列印出來切片的長度小於10000,說明有資料丟失。

通過加鎖可以解決:

func main() 

var mu sync.mutex

for i := 0; i < 10000; i++ (i)

} time.sleep(2 * time.second)

for i, v := range s

}

多個goroutine對同乙個map讀是安全的

func main() 

count := 0

for i := 0; i < 10000; i++

count++

}(i)

}time.sleep(2 * time.second)

fmt.println(count)

}

多個goroutine對同乙個map寫會panic

func main() (i)

}time.sleep(2 * time.second)

fmt.println(count)

fmt.println(len(m))

}

會引數panic錯誤:fatal error: concurrent map writes

解決方法也是加鎖。

兩個goroutine分別對同乙個map進行讀和寫會panic

func main() 

}()go func()

}}()

time.sleep(2 * time.second)

fmt.println(len(m))

}

會報錯:fatal error: concurrent map read and map write

需要注意的是並不是所有情況都會報錯,測試當i<1000的時候沒有報錯

通過加鎖可以解決:

func main() 

}()go func()

mu.unlock()

}}()

time.sleep(2 * time.second)

fmt.println(len(m))

}```

golang slice效能分析

golang在gc這塊的做得比較弱,頻繁地申請和釋放記憶體會消耗很多的資源。另外slice使用陣列實現,有乙個容量和長度的問題,當slice的容量用完再繼續新增元素時需要擴容,而這個擴容會把申請新的空間,把老的內容複製到新的空間,這是乙個非常耗時的操作。有兩種方式可以減少這個問題帶來的效能開銷 在s...

golang Slice相關知識

slice 又稱動態陣列,依託陣列實現,可以方便的進行擴容 傳遞等,實際使用中比陣列更靈活。slice依託陣列實現,底層陣列對使用者遮蔽,在底層陣列容量不足時可以實現自動重分配並生成新的slice。接下來按照實際使用場景分別介紹其實現機制。宣告和初始化變數切片主要有以下幾種 內建函式len 和cap...

golang slice的判空 和 併發安全

判斷slice是否為空,不能與nil進行比較做判斷,因為slice有可能已初始化。而是應該使用len計算長度。例如package main import fmt func main fmt.println slice1 nil slice1 nil fmt.println slice1 len le...