有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Webapp:在AppContext中安全地更新共享列表/映射

我的WebAppContext中有列表和地图
大多数情况下,这些数据只由多个线程读取,但有时需要更新或添加一些数据
我想知道在不引起ConcurrentModificationException的情况下,最好的方法是什么

我认为使用CopyOnWriteArrayList我可以实现我想要的
-我不必在每次读取操作上同步
-我可以在其他线程读取列表时安全地更新列表

这是最好的解决方案吗?地图呢


共 (2) 个答案

  1. # 1 楼答案

    CopyOnWriteArrayList应该可以满足您作为List的需求。对于Map,您可能希望查看^{},除非您需要SortedMap,在这种情况下^{}会更好

    我在ConcurrentHashMap中看到的唯一问题是,它的迭代器每次只能被一个线程访问,即使它们不会抛出ConcurrentModificationException

  2. # 2 楼答案

    使用CopyOnWriteArrayList时要小心。典型的收集(规模非常广泛)是80%的读取、19%的写入和1%的删除。CopyOnWriteArraylist在这些条件下的性能很差。CopyOnWriteArrayList的最佳使用是在读取量为~90-95%时。写得太多会严重降低性能(类在调用compareTo时抛出UnsupportedOperationException,因为它的Collections.sort非常糟糕)

    基本上,如果你做了大量的阅读和很少的写作,一个CopyWorkRealRayList是非常棒的,但是如果你不是,你可以考虑收藏。同步列表。如果您想确保非阻塞读取,那么CopyOnWriteArrayList显然是合适的

    ConcurrentHashMap可以很好地替代现有的任何映射实现(至少未排序)。它不会在读取时阻塞,并且只在写入时阻塞特定的存储桶,因此速度非常快