假如我们没有用协程通道或者加锁的方式,直接并发使用map,会出现线性不安全
例如:
报错:
解决方法:
使用锁之后就不会有问题:
又或者是利用协程通道,来保证线程安全
不要通过共享内存来通信,而要通过通信来共享内存加锁Channel。
反正涉及到并发安全性的数据结构,尽量使用协程通道:发送一个数据到Channel 和 从Channel接收一个数据 都是 原子性的。
可以认为加锁的map就是erlang里面的ets,而使用协程通道就是erlang里面的进程里的数据结构
最后我们来看一下go对redis的并发操作:
也没任何问题!!!
因为Redis服务端是个单线程的架构,不同的Client虽然看似可以同时保持连接,但发出去的命令在服务器看来是序列化执行的,
因此对服务端来说,并不存在并发问题!!!