map併發寫問題

2021-10-18 15:31:23 字數 1558 閱讀 8663

var wg sync.waitgroup

m :=

make

(map

[int

]int

)for i :=

0; i <

10; i++

wg.add(10)

for i :=

0; i <

10; i++

(i,&m)

} wg.

wait()

//fatal error: concurrent map iteration and map write

//map[0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7 8:8 9:9]

//goroutine 16 [running]:

0x26)

//d:/go/src/runtime/panic.go:1116 +0x79 fp=0xc000157a88 sp=0xc000157a58 pc=0x435ed9

var wg sync.waitgroup

//m := make(symap[int]int)

m := sync.map

for i :=

0; i <

10; i++

wg.add(10)

for i :=

0; i <

10; i++

(i,&m)

} wg.

wait()

//我是key:1,value:11,狀態:true

//我是key:9,value:19,狀態:true

//我是key:2,value:12,狀態:true

//我是key:3,value:13,狀態:true

//我是key:4,value:14,狀態:true

//我是key:5,value:15,狀態:true

//我是key:6,value:16,狀態:true

//我是key:7,value:17,狀態:true

//我是key:8,value:18,狀態:true

//我是key:0,value:10,狀態:true

有一些讀寫細節問題,看注釋
var wg sync.waitgroup

m :=

make

(map

[int

]int

)for i :=

0; i <

10; i++

num :=

100var s sync.rwmutex

wg.add(num)

for i :=

0; i < num; i++

fmt.

print

(m)//讀寫操作都需要拿到鎖之後進行

s.unlock()

fmt.

print

(m)//鎖釋放後再讀操作會引發map併發讀寫問題

wg.done()

}()}

wg.wait

()

map併發安全問題

go語言官方部落格中 go maps in action 有說明 map型別不是併發安全的 它沒有定義當你同時讀取和寫入map時發生的情況,如果你需要在併發執行的goroutine中讀取和寫入map,那麼訪問時必須通過某種同步機制來調解。讀寫鎖 sync.rwmutex 是用來保護map的一種常用方...

併發容器類Map

hashmap concurrenthashmap 認識了解concurrentskiplistmap 執行緒不安全 擴容時是非原子操作,會存在資料不完整,讀的時候會存在問題,執行緒不安全。從抽象角度,帶著問題看原始碼,看最熟悉的方法,主要關注是什麼而不是為什麼這麼做。jdk1.7版本 儲存資料結構...

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

一 map併發讀寫問題 如果map由多協程同時讀和寫就會出現 fatal error concurrent map read and map write的錯誤 如下 很容易就出現map併發讀寫問題 func main go func time.sleep time.second 20 多個協程同時寫...