KeyRuleHolder 麻烦帮忙解答下
what is cow
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
那么问题来了,为什么要用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 所损耗的性能可以忽略不计,或者说读操作的性能提升远大于写操作的性能损耗。
这是我的理解,如有不对还请指出
登录 后才可以发表评论