【发布时间】:2015-11-14 08:29:50
【问题描述】:
我有一堂课:
- 2 个字段包含按时间排序的列表(list1、list2)。
- 3 种只读方法,迭代上面的列表以 生成汇总统计信息。
- 1 变异方法,在 list1 中查找给定“新项目”的匹配项。 如果没有找到匹配项,它会将“new-item”添加到 list1。 如果找到匹配项,它会从 list1 中删除匹配项并将匹配项和“新项目”添加到 list2 中。
让我们假设所有方法的多个并发调用是可能的。我需要在最大化性能的同时实现线程安全。
Approach1(非常慢) - 将字段类型声明为 ArrayList 并在所有方法上使用 synchronize 关键字。
Approach2 - 将字段类型声明为CopyOnWriteArrayList 并同步变异方法。
问题
- Approach2 是否确保线程安全?
- 有更好的选择吗?
【问题讨论】:
-
变异方法是否会发生多个并发调用?
-
请注意,如果您计划在同步集合上使用 spliterator/stream/parallelStream/Iterator,您必须自己处理同步。 javadoc中好像没有记载,但是内部类的源码里面有关于它的cmets。
-
copyOnWriteArrayList也很慢,因为每次插入都需要 O(n) -
你有什么样的有序收藏?数组列表?排序地图?你对收藏有什么要求?变异方法总是将项目插入到同一个集合中,还是插入到两个不同的集合中?
标签: java multithreading java.util.concurrent