Go中的地图没有线程安全意味着什么?

Go中的地图没有线程安全意味着什么?,go,Go,我想知道当多个Goroutin访问go maps时会发生什么,让我们假设我们有一个map[int]*用户。通过多个goroutin修改用户结构的字段是否会导致数据损坏?或者像len()这样的操作不是线程安全的,如果map在Go中是线程安全的,那会有什么不同呢?同时修改*用户可能会导致损坏,而不管映射如何。只要不修改映射,同时从映射读取指针是安全的。将数据*用户点修改为不会更改地图本身 同时修改map[int]*User本身也有数据损坏的风险 没有良性的数据竞争,请始终使用竞争检测器测试代码 同时

我想知道当多个Goroutin访问go maps时会发生什么,让我们假设我们有一个
map[int]*用户
。通过多个goroutin修改用户结构的字段是否会导致数据损坏?或者像
len()
这样的操作不是线程安全的,如果map在Go中是线程安全的,那会有什么不同呢?

同时修改
*用户
可能会导致损坏,而不管
映射如何。只要不修改映射,同时从映射读取指针是安全的。将数据
*用户
点修改为不会更改地图本身


同时修改
map[int]*User
本身也有数据损坏的风险


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

同时修改
*用户
可能会导致损坏,无论
映射如何。只要不修改映射,同时从映射读取指针是安全的。将数据
*用户
点修改为不会更改地图本身


同时修改
map[int]*User
本身也有数据损坏的风险


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

同时修改
*用户
可能会导致损坏,无论
映射如何。只要不修改映射,同时从映射读取指针是安全的。将数据
*用户
点修改为不会更改地图本身


同时修改
map[int]*User
本身也有数据损坏的风险


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

同时修改
*用户
可能会导致损坏,无论
映射如何。只要不修改映射,同时从映射读取指针是安全的。将数据
*用户
点修改为不会更改地图本身


同时修改
map[int]*User
本身也有数据损坏的风险

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

最简单的例子

go WorkerMethodOne(myMapReference)
go WorkerMethodTwo(myMapReference)
在worker方法1中,我有一些类似的代码(示例)

i:=0的
;i
然后,当WorkerMethodTwo迭代同一映射并尝试访问刚被删除的项时,会发生什么情况?虽然a
k,err:=map[index]
可能仍然是安全的,但与许多语言中抛出的方法不同,它没有意义,而且不可预测。最终,更糟糕的例子可能会发生,比如试图同时写入某些
*用户的值。它可能会导致对实际值(指针处的值)的并发修改,或者您可以将指针从您的下方拉出来,并随机使用与预期值不同的值。这与让两个闭包作为goroutine运行并开始修改非原子的
int
,而不锁定/使用互斥锁没有什么区别。您不知道会发生什么,因为在两个完全解耦的执行之间存在内存争用

go WorkerMethodOne(myMapReference)
go WorkerMethodTwo(myMapReference)
在worker方法1中,我有一些类似的代码(示例)

i:=0的
;i
然后,当WorkerMethodTwo迭代同一映射并尝试访问刚被删除的项时,会发生什么情况?虽然a
k,err:=map[index]
可能仍然是安全的,但与许多语言中抛出的方法不同,它没有意义,而且不可预测。最终,更糟糕的例子可能会发生,比如试图同时写入某些
*用户的值。它可能会导致对实际值(指针处的值)的并发修改,或者您可以将指针从您的下方拉出来,并随机使用与预期值不同的值。这与让两个闭包作为goroutine运行并开始修改非原子的
int
,而不锁定/使用互斥锁没有什么区别。您不知道会发生什么,因为在两个完全解耦的执行之间存在内存争用

go WorkerMethodOne(myMapReference)
go WorkerMethodTwo(myMapReference)
在worker方法1中,我有一些类似的代码(示例)

i:=0的
;i
然后,当WorkerMethodTwo迭代同一映射并尝试访问刚被删除的项时,会发生什么情况?虽然a
k,err:=map[index]
可能仍然是安全的,但与许多语言中抛出的方法不同,它没有意义,而且不可预测。最终,更糟糕的例子可能会发生,比如试图同时写入某些
*用户的值。它可能会导致对实际值(指针处的值)的并发修改,或者您可以将指针从您的下方拉出来,并随机使用与预期值不同的值。这与让两个闭包作为goroutine运行并开始修改非原子的
int
,而不锁定/使用互斥锁没有什么区别。您不知道会发生什么,因为在两个完全解耦的执行之间存在内存争用

go WorkerMethodOne(myMapReference)
go WorkerMethodTwo(myMapReference)
在worker方法1中,我有一些类似的代码(示例)

i:=0的
;i
然后,当WorkerMethodTwo迭代同一映射并尝试访问刚被删除的项时,会发生什么情况?虽然a
k,err:=map[index]
可能仍然是安全的,这与许多语言不同