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)
}
View Code

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
   })
}
View Code

参考:http://c.biancheng.net/view/34.html

2 slice并发也是不安全的,可以通过加锁的方式来实现并发安全

https://blog.csdn.net/weixin_43851310/article/details/87897247?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai

原文地址:https://www.cnblogs.com/xxswkl/p/14248620.html