Frequently Asked Questions: Go的map操作为什么不定义为原子操作

Go的map操作为什么不定义为原子操作?

经过漫长的讨论,我们决定maps平常的使用不需要保证多协程的并发安全。而当需要考虑多协程并发安全的时候,往往map是一个更大的数据结构或者计算过程的一部分,这这些早就被同步锁住了。因此如果要求所有的map操作都先获取一个互斥锁反而会降低大部分程序运行速度,而换来一丁点儿的安全提升。这其实不是一个简单的决定,因为它意味着不受控制的map设计可能会导致程序崩溃。

Go后续版本不会排除原子实现map。当需要的时候,比如运行一个不信任的代码的时候,一些方法可以实现map的访问互锁(PS:不是很懂 the implementation could interlock map access)。

map的不安全只有在进行map更新的时候会发生。只要所有的协程都是在读取一个map,或者用for-range遍历map的时候,不要去分配或者删除map的元素,那么map的并发操作就算不上同步锁也是安全的。

为了帮助用户发现map的错误使用,Go语言实现了一些方法会提醒用户在更新map的时候可能存在并发安全的问题。

preclude v 排除,阻止,妨碍
aid n 协助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值