golang中map併發讀寫問題及解決方法

2022-03-04 15:08:07 字數 1202 閱讀 2346

一、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,說明有資料丟失。通過...