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

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


慕尼黑8549860
浏览 162回答 2
2回答

子衿沉夜

同时修改*User可能导致腐败不管的map。只要没有对地图进行修改,同时从地图中读取指针是安全的。修改数据*User点不会改变地图本身。同时修改map[int]*User自身也存在数据损坏的风险。没有良性的数据竞争,始终使用竞争检测器测试您的代码。

浮云间

最简单的例子;go WorkerMethodOne(myMapReference)go WorkerMethodTwo(myMapReference)在工作方法一中,我有一些这样的代码(示例)for i := 0; i < len(MyMapReference); i++ {&nbsp; &nbsp; if i % 2 == 0 {&nbsp; &nbsp; &nbsp; &nbsp;delete(MyMapReference, i)&nbsp; &nbsp; }}那么当 WorkerMethodTwo 迭代同一个映射并尝试访问刚刚删除的项目时,会发生什么?虽然 ak, err := map[index]可能仍然是安全的,但与您抛出的许多语言不同,它没有意义并且是不可预测的。最终更糟糕的例子可能会发生,比如尝试同时写入 some 的值*User。它可能会导致对实际值(指针上的内容)的并发修改,或者您可以将指针从您的下方拉出并随机使用与您预期不同的值等。这与将两个闭包作为 goroutine 运行并开始修改非原子int而不锁定/使用互斥锁没有什么不同。你不要什么'
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go