java - 同步与 Collection.synchronizedList 与 CopyOnWriteArrayList

标签 java list collections

如果我的要求规定我对列表的大部分访问都是为了阅读和修改(如果有的话),那么为什么我不能只执行以下任一操作

  1. 同步modifyList方法并使用ArrayList。对 arraylist 的所有读取都将不同步 或
  2. 在modifyList中,执行Collections.synchronizedList(arrayList) 或
  3. CopyOnWriteArrayList(不确定它在这里买什么)

为什么我要使用其中一个?哪个更好?

最佳答案

对于 1 和 2,我不确定您想要通过仅同步写入来完成什么。如果有潜在的读者可能正在迭代列表,或者正在通过索引查找内容,那么仅同步写入并不能证明什么。读取器在写入过程中仍然可以读取,并且可能会看到脏数据或出现异常(ConcurrentModificationIndexOutOfBounds。)

如果您希望在其他线程进行更改时进行“安全”迭代和获取,则需要同步读取和写入。此时,您可能刚刚使用了 Vector

CopyOnWriteArrayList 是专门为您想做的事情而构建的。它购买了安全的无同步迭代器,同时大大增加了写入成本。它还具有完全封装在 JavaSE API 中的优势,可以做您想做的事情(或者从简洁的问题来看您似乎想做的事情:)),这可以减少 future 开发人员的“惊讶”。

(请注意,如果您有涉及使用“get”读取的多步骤过程,即使使用 CopyOnWriteArrayList 也可能并不完全安全。您需要评估您的代码实际执行的操作以及是否存在交错修改会破坏正在获取的方法。)

关于java - 同步与 Collection.synchronizedList 与 CopyOnWriteArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4717456/

相关文章:

python - 使用 Itertools 从多个列表中创建元素组合列表

c# - 帮助解决 "Collection was modified; enumeration operation might not execute."

java - 如何在java中获取Map中重复键的最新值?

java - 向图形输出添加暂停

java - 如何编写 main 方法来启动 java 程序?

arrays - 如何在列表的每个元素之间插入值?

.net - 数组与列表的性能

c# - 我可以使用 C# 集合来保存具有自引用关系的类实例吗?

java - 你如何实例化一个调用自身的另一个实例化的类?

java - xmlbeans - 设置复杂类型的内容