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...