我们有一个用go做的项目,其中用到了zmq4进行通信,一个简单的rpc过程,早期远端是使用一个map去做ip和具体socket的映射。所以我们决定使用sync.Map来替代这个设计,然后出了第一版代码,写的非常简单,只做了简单的替换:乍一看似乎没什么问题?上面的代码恰恰会造成多个线程同时拿到socket实例,然后就crash了。看来也只能加锁了,不过这次加锁不能加到整个map上,否则还会有性能问题,那就考虑减小锁的粒度吧,使用锁包装socket。单纯解决这个问题也很简单,就是使用然而这还没完,我们的写入新值的操作不光是调用一个api创建socket就完了,还要有一系列的初始化操作,我们必须保证在初始化完成之前,其他通过Load拿到这个实例的协程无法真正访问socket实例。

golang中sync.Map并发创建、读取问题实战记录

golang中sync.Map并发创建、读取问题实战记录

golang中sync.Map并发创建、读取问题实战记录