map slice并发不安全问题
1 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的,
如下会报并发读写的错误fatal error: concurrent map read and map write
func main(){ // 创建一个int到int的映射 m := make(map[int]int) // 开启一段并发代码 go func() { // 不停地对map进行写入 for { m[1] = 1 } }() // 开启一段并发代码 go func() { // 不停地对map进行读取 for { _ = m[1] } }() time.Sleep(time.Second * 5) }
Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map,sync.Map 和 map 不同,不是以语言原生形态提供,而是在 sync 包下的特殊结构,Store进行存储,Load进行查询,Delete进行删除,Range进行遍历,
func main() { var scene sync.Map // 将键值对保存到sync.Map scene.Store("greece", 97) scene.Store("london", 100) scene.Store("egypt", 200) // 从sync.Map中根据键取值 fmt.Println(scene.Load("london")) // 根据键删除对应的键值对 scene.Delete("london") // 遍历所有sync.Map中的键值对 scene.Range(func(k, v interface{}) bool { fmt.Println("iterate:", k, v) return true }) }
参考:http://c.biancheng.net/view/34.html
2 slice并发也是不安全的,可以通过加锁的方式来实现并发安全