Open
Description
Go - sync.Map
include #56
为什么说map或者slice是线程不安全的?
因为他们内部时间不能保证各个函数是原子操作,并发执行时不能保证函数执行的正确性。
比如
func appendValue(i int) {
// mu.Lock()
// defer mu.Unlock()
s = append(s, i)
m[strconv.Itoa(i)] = i
wg.Done()
}
func main() {
for i := 0; i < 10000; i++ { // 10000个协程同时添加切片
wg.Add(1)
go appendValue(i)
}
wg.Wait()
fmt.Println(len(s))
fmt.Println(len(m))
}
最后的slice里面没有1w个元素,而map根本不允许这样操作,直接报错
fatal error: concurrent map writes
sync.Map 和 map的区别
sync.Map 不是 map + mutex. 大多数时候应该用自己定义的map+mutex或者其他同步机制。
一下两种场景可以使用sync.Map:
- 读远远多于写和删
- 不同goroutine, read,write,overwrite的是不想交的keys