synchronized与Collection.synchronizedList对比CopyOnWriteArrayList

时间:2011-01-17 20:19:05

标签: java list collections

如果我的要求规定我对列表的大多数访问都是为了阅读和修改(如果有的话),那么为什么我不能做以下任何一种

  1. 同步modifyList方法并使用ArrayList。来自arraylist的所有读取都将是不同步的 或
  2. 在modifyList里面,做一个Collections.synchronizedList(arrayList) 或
  3. CopyOnWriteArrayList(不知道它在这里买什么)
  4. 我为什么要使用?哪个更好?

2 个答案:

答案 0 :(得分:4)

1& 2,我不确定你只想通过同步写入来完成什么。如果潜在的读者可能正在迭代列表,或者正在按索引查找内容,那么只有同步写入才能证明什么。在写入过程中,读者仍然可以阅读,可能会看到脏数据或获得异常(ConcurrentModificationIndexOutOfBounds。)

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

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

(请注意,如果你的多步骤过程涉及使用'{''进行读取,即使使用CopyOnWriteArrayList也可能不完全安全。你需要评估你的代码实际做了什么以及交错修改是否会破坏得到的方法。)

答案 1 :(得分:2)

另一个解决方案是使用ReentrantReadWriteLock,这样你就可以在读取操作上使用只读锁定(不会阻止其他读取),并在写入时使用写入锁定(这将阻塞直到没有读取,并且在释放之前不允许任何读锁定。