2 回答
TA贡献1752条经验 获得超4个赞
否,地图操作不是原子/线程安全的,因为您的问题的评论者指出了golang FAQ“为什么地图操作未定义为原子的?” 。
为了确保您的访问安全,建议您使用Go的频道作为资源访问令牌的一种方式。该通道用于简单地传递令牌。任何想要修改它的人都会从渠道请求-阻止或非阻止。处理完地图后,它将令牌传递回通道。
遍历和使用地图应该足够简单且简短,因此您应该可以只使用一个令牌进行完全访问。
如果不是这种情况,并且您将地图用于更复杂的东西/资源消耗者需要更多时间,则可以实现读写器访问令牌。因此,在任何给定时间,只有一个编写者可以访问该地图,但是当没有任何编写者处于活动状态时,令牌将传递给任意数量的读取者,而这些读取者不会修改该映射(因此他们可以同时读取)。
TA贡献1818条经验 获得超11个赞
您可以使用并发映射为您处理并发难题。
// Create a new map.
map := cmap.NewConcurretMap()
// Add item to map, adds "bar" under key "foo"
map.Add("foo", "bar")
// Retrieve item from map.
tmp, ok := map.Get("foo")
// Checks if item exists
if ok == true {
// Map stores items as interface{}, hence we'll have to cast.
bar := tmp.(string)
}
// Removes item under key "foo"
map.Remove("foo")
- 2 回答
- 0 关注
- 160 浏览
添加回答
举报