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 多個協程同時寫...