我想确切地知道当多个 gooutins 访问 go 映射时会发生什么,假设我们有一个map[int]*User. 通过多个 gooutins 修改用户结构的字段会导致数据损坏吗?或者只是像len()不是线程安全的操作,如果 map 在 Go 中是线程安全的,会有什么不同?
2 回答
子衿沉夜
TA贡献1828条经验 获得超3个赞
同时修改*User
可能导致腐败不管的map
。只要没有对地图进行修改,同时从地图中读取指针是安全的。修改数据*User
点不会改变地图本身。
同时修改map[int]*User
自身也存在数据损坏的风险。
没有良性的数据竞争,始终使用竞争检测器测试您的代码。
浮云间
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而不锁定/使用互斥锁没有什么不同。你不要什么'
- 2 回答
- 0 关注
- 157 浏览
添加回答
举报
0/150
提交
取消