400 Star 3.7K Fork 1.2K

GVP京东零售 / hotkey

 / 详情

KeyRuleHolder 为啥是用加锁来保障安全性,而没有直接用cow这种

待办的
任务
创建于  
2022-06-21 00:41

KeyRuleHolder 麻烦帮忙解答下 :hibiscus:

评论 (5)

等风的季节 创建了任务

maybe copy on wirte?

是的呀 CopyOnWriteArrayList这种

那么问题来了,为什么要用CopyOnWriteArrayList,它的必要性是什么

这里首先有第一个问题:synchronized 使用的问题,KEY_RULES 被三个方法使用,分别是 putRules()findRule()isKeyInRule(),但只有 putRules() 中对 KEY_RULES 使用了 synchronized 修饰,findRule()isKeyInRule() 没有加 synchronized,这样无法保证线程安全、可见性。
解决这个问题最简单的方式是把后两个方法中的 for 循环用 synchronized 包起来输入图片说明

这样虽然保证了(读-写)操作的串行,但也会阻塞(读-读)操作,导致读性能急剧下降,这是无法接受的,因为 KEY_RULES 读操作的数量级绝对远大于写操作。
要解决上述读多写少又要保证可见性的问题,自然而然的会想到读写锁 ReadWriteLock。但对于这个场景,CopyOnWriteArrayList 更为合适,因为它在使用迭代器遍历的时候甚至都不会加锁,而 ReadWriteLock 还需要加读锁;对于写操作,因为 KEY_RULES 的修改是很少发生的,所以 CopyOnWriteArrayList copy 所损耗的性能可以忽略不计,或者说读操作的性能提升远大于写操作的性能损耗。

这是我的理解,如有不对还请指出

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(4)
303698 tianyalei 1578919857 7703233 ekoclike 1653998742
Java
1
https://gitee.com/jd-platform-opensource/hotkey.git
git@gitee.com:jd-platform-opensource/hotkey.git
jd-platform-opensource
hotkey
hotkey

搜索帮助