1)背景:很多人对线程安全我认为是有误区的,
误区1:redis是单线程的,所以没有线程安全的问题。
误区2:chm是线程安全的容器,用了就没线程安全的问题了。
2)其实:上面的是误区,他们说的线程安全,其实是:共同点就是:只是单个单个操作的线程安全。
以:删、加 好友为例子。
玩家1和玩家2的数据进行操作时,其实是在各自的线程执行的,只不过,拿redis来做了数据存储,对数据的操作,则是redis线程执行的。
f1(){
addFriend12 // 1
addFriend21 // 2
}
f2(){
delFriend12 // 3
delFriend21 // 4
}
思考下:
如果f1在加好友和f2删除好友时是同时执行,其实1,2,3,4这4个操作那么有可能出现1,3,4,2这样子的情况,这时理论上是有可能出现问题的,虽然概率很小。
但是线上我发现别的这样子写代码了,而且运营时没出现问题。
如果一定要保证线程安全,那么需要上Lua事务或者Lua代码。
3)chm的remove和add是线程安全的,但是同时remove和add,这2个操作合并到一起,则不是线程安全的。
但是:chm提供的有:不存在,才添加。这种原子操作。
如果要保证,则还是需要加锁,同时控制好锁的粒度。



