java Webapp:在AppContext中安全地更新共享列表/映射
我的WebAppContext中有列表和地图
大多数情况下,这些数据只由多个线程读取,但有时需要更新或添加一些数据
我想知道在不引起ConcurrentModificationException的情况下,最好的方法是什么
我认为使用CopyOnWriteArrayList我可以实现我想要的
-我不必在每次读取操作上同步
-我可以在其他线程读取列表时安全地更新列表
这是最好的解决方案吗?地图呢
你可以在下面搜索框中键入要查询的问题!
我的WebAppContext中有列表和地图
大多数情况下,这些数据只由多个线程读取,但有时需要更新或添加一些数据
我想知道在不引起ConcurrentModificationException的情况下,最好的方法是什么
我认为使用CopyOnWriteArrayList我可以实现我想要的
-我不必在每次读取操作上同步
-我可以在其他线程读取列表时安全地更新列表
这是最好的解决方案吗?地图呢
# 1 楼答案
CopyOnWriteArrayList
应该可以满足您作为List
的需求。对于Map
,您可能希望查看^{SortedMap
,在这种情况下^{我在ConcurrentHashMap中看到的唯一问题是,它的迭代器每次只能被一个线程访问,即使它们不会抛出
ConcurrentModificationException
# 2 楼答案
使用CopyOnWriteArrayList时要小心。典型的收集(规模非常广泛)是80%的读取、19%的写入和1%的删除。CopyOnWriteArraylist在这些条件下的性能很差。CopyOnWriteArrayList的最佳使用是在读取量为~90-95%时。写得太多会严重降低性能(类在调用compareTo时抛出UnsupportedOperationException,因为它的Collections.sort非常糟糕)
基本上,如果你做了大量的阅读和很少的写作,一个CopyWorkRealRayList是非常棒的,但是如果你不是,你可以考虑收藏。同步列表。如果您想确保非阻塞读取,那么CopyOnWriteArrayList显然是合适的
ConcurrentHashMap可以很好地替代现有的任何映射实现(至少未排序)。它不会在读取时阻塞,并且只在写入时阻塞特定的存储桶,因此速度非常快