线程安全的map
众所周知,go中的map不是线程安全的,两个线程(或协程)同时修改map中同一个key的value,会产生不确定的结果。而在golang中,遇到这种情况,程序会panic退出,个人觉得这样严苛的限制可以迫使开发者明白自己在写什么,以免未来陷入排查并发问题的痛苦之中。
关于go开发者关于设计非并发安全的map的初衷可以看这里:
Why are map operations not defined to be atomic?
目前运用比较广泛的有三种线程安全的map实现方法:
sync.RWMutex + map
组成struct
一个利用分段锁原理实现的map: concurrent-map