为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的地图不是线程安全意味着什么?

Go 中的地图不是线程安全意味着什么?

Go
慕尼黑8549860 2021-10-25 18:26:56
我想确切地知道当多个 gooutins 访问 go 映射时会发生什么,假设我们有一个map[int]*User. 通过多个 gooutins 修改用户结构的字段会导致数据损坏吗?或者只是像len()不是线程安全的操作,如果 map 在 Go 中是线程安全的,会有什么不同?
查看完整描述

2 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

同时修改*User可能导致腐败不管map。只要没有对地图进行修改,同时从地图中读取指针是安全的。修改数据*User点不会改变地图本身。

同时修改map[int]*User自身也存在数据损坏的风险。

没有良性的数据竞争,始终使用竞争检测器测试您的代码。


查看完整回答
反对 回复 2021-10-25
?
浮云间

TA贡献1829条经验 获得超4个赞

最简单的例子;


go WorkerMethodOne(myMapReference)

go WorkerMethodTwo(myMapReference)

在工作方法一中,我有一些这样的代码(示例)


for i := 0; i < len(MyMapReference); i++ {

    if i % 2 == 0 {

       delete(MyMapReference, i)

    }

}

那么当 WorkerMethodTwo 迭代同一个映射并尝试访问刚刚删除的项目时,会发生什么?虽然 ak, err := map[index]可能仍然是安全的,但与您抛出的许多语言不同,它没有意义并且是不可预测的。最终更糟糕的例子可能会发生,比如尝试同时写入 some 的值*User。它可能会导致对实际值(指针上的内容)的并发修改,或者您可以将指针从您的下方拉出并随机使用与您预期不同的值等。这与将两个闭包作为 goroutine 运行并开始修改非原子int而不锁定/使用互斥锁没有什么不同。你不要什么'


查看完整回答
反对 回复 2021-10-25
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信