一、map併發讀寫問題
如果map由多協程同時讀和寫就會出現 fatal error:concurrent map read and map write的錯誤
如下**很容易就出現map併發讀寫問題
func main()
}()go func()
}()time.sleep(time.second*20)
}多個協程同時寫也會出現fatal error: concurrent map writes的錯誤
如下**很容易出現map併發寫的問題
func main()
}()}
time.sleep(time.second*20) //讓執行main函式的主協成等待20s,不然不會執行上面的併發操作
二、出現問題的原因
因為map為引用型別,所以即使函式傳值呼叫,引數副本依然指向對映m, 所以多個goroutine併發寫同乙個對映m, 寫過多執行緒程式的同學都知道,對於共享變數,資源,併發讀寫會產生競爭的, 故共享資源遭到破壞
三、解決方法
1、加鎖
(1)通用鎖
type demo struct {
data map[string]string
lock sync.mutex
func (d demo) get(k string) string{
d.lock.lock()
defer d.lock.unlock()
return d.data[k]
func (d demo) set(k,v string) {
d.lock.lock()
defer d.lock.unlock()
d.data[k]=v
(2)讀寫鎖
type demo struct {
data map[string]string
lock sync.rwmutex
func (d demo) get(k string) string{
d.lock.rlock()
defer d.lock.runlock()
return d.data[k]
func (d demo) set(k,v string) {
d.lock.lock()
defer d.lock.unlock()
d.data[k]=v
2、利用channel序列化處理
golang中map併發讀寫問題及解決方法
一 map併發讀寫問題 如果map由多協程同時讀和寫就會出現 fatal error concurrent map read and map write的錯誤 如下 很容易就出現map併發讀寫問題 func main go func time.sleep time.second 20 多個協程同時寫...
Golang實現對map的併發讀寫
在golang多協程的情況下使用全域性map時,如果不做執行緒同步,會出現panic的情況。為了解決這個問題,通常有兩種方式 寫了乙個模擬程式對map中的一項進行讀或者寫,後台一直執行的協程阻塞的接受讀寫訊號,並對map進行操作,但是讀操作的時候沒想好怎麼返回這個值。後來想到用傳引用的方式,定義結構...
golang Slice和Map併發安全問題
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,說明有資料丟失。通過...