栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

警惕多个原子操作合并到一起,则不是原子这个问题1.redis加删好友为例子 2.chm的例子

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

警惕多个原子操作合并到一起,则不是原子这个问题1.redis加删好友为例子 2.chm的例子

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提供的有:不存在,才添加。这种原子操作。

如果要保证,则还是需要加锁,同时控制好锁的粒度。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/683756.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号