解决并发 map 安全问题,锁与队列两种方案
当并发的读写 map 时,会报这样的错误 fatal error: concurrent map read and map write
一般都会想到使用加锁的方式来解决,在看 gorilla/websocket
这个项目时,发现了另外一种解决思路,使用队列把并发改为单线程,但是哪种方案更好呢?
##使用到的场景记录
具体的场景是,当新用户加入聊天室的时候,维护用户 token 和对应websocket连接。
第一种不加锁的情况,如果同一时间有很多用户加入或退出,则会导致程序异常退出,代码如下图:
第二种通过加锁解决,在结构体中增加一个读写锁,代码实现如下:
第三种方式,将所有加入或退出的用户放到 channel 队列中,提供一个线程来消费队列,这样就避免了并发。代码如下:
对比两种方案
结论:要根据具体场景进行分析。
初步查了很多资料,需要根据具体情况来判断采用哪种方案。
之后再补充详细的 map 锁相关内容。
参考资料: