解决并发 map 安全问题,锁与队列两种方案

当并发的读写 map 时,会报这样的错误 fatal error: concurrent map read and map write

一般都会想到使用加锁的方式来解决,在看 gorilla/websocket 这个项目时,发现了另外一种解决思路,使用队列把并发改为单线程,但是哪种方案更好呢?

##使用到的场景记录

具体的场景是,当新用户加入聊天室的时候,维护用户 token 和对应websocket连接。

第一种不加锁的情况,如果同一时间有很多用户加入或退出,则会导致程序异常退出,代码如下图:

image-20190130151325002

第二种通过加锁解决,在结构体中增加一个读写锁,代码实现如下:

image-20190130151528745

第三种方式,将所有加入或退出的用户放到 channel 队列中,提供一个线程来消费队列,这样就避免了并发。代码如下:

image-20190130151830895

对比两种方案

结论:要根据具体场景进行分析。

初步查了很多资料,需要根据具体情况来判断采用哪种方案。

之后再补充详细的 map 锁相关内容。

参考资料:

https://www.zhihu.com/question/53303879