2014-10-09 271 views
1

我只调用addAll并清除列表,但需要它来线程安全,是否有任何现有List for this?谢谢java列表适用于addAll和clear的线程安全

+1

“线程安全”是一个很大的术语。如果两个线程同时调用addAll,是不是足够了没有'ConcurrentModificationException',或者是否需要第二个线程元素之前添加的第一个线程的所有元素? – Mureinik 2014-10-09 10:08:56

+0

如果您想要高质量的特定答案,您确实需要添加有关该方案的更多详细信息。 – biziclop 2014-10-09 10:18:24

回答

1

使用Collections.synchronizedList(List list)将满足这些要求的清单创建,提供的同步列表是调用addAll(...)时的目标对象,而不是参数。

如果同步列表(如上创建)是参数,则问题是addAll(list)迭代参数list,并且迭代同步列表不是原子的。如果另一个线程在添加时更新list,则您有可能得到ConcurrentModificationException

如果你需要做一个线程安全的方式addAll(list)在并发更新的脸list,那么你需要做一个listCopyOnWriteArrayList

0

如果你想使用exsting列表作为同步单,去Collections.synchronizedList(list)或正在创建目标列表,那么你可以去CopyOnWriteArrayList

-1

的CopyOnWriteArrayList是synchronizedList并发替代,在某些常见的情况下提供更好的并发&消除了在迭代期间锁定或复制集合的需要。

写入集合上的副本从派生它们的线程安全性的事实是,作为一个有效的不可变对象被正确发布,访问它时不需要进一步的同步。他们通过创建&每次修改时重新发布集合的新副本来实现可变性。无论后续修改如何,该集合都不会引发ConcurrentModificationException。