什么java List适用于addAll上的线程安全和清除

时间:2014-10-09 10:05:20

标签: java collections thread-safety

我只调用addAll并清除List,但需要它是线程安全的,是否有任何现有的List?感谢

5 个答案:

答案 0 :(得分:1)

列表未同步。  所以它不是线程安全的。 如果你想要它作为线程安全意味着可以使列表成为线程安全的,你可以使用

Collections.synchronizedList(List list)

答案 1 :(得分:1)

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

如果同步列表(如上所述创建)是参数,那么问题是addAll(list)迭代参数list,并且迭代同步列表不是原子的。如果另一个帖子在添加时更新list,则您可能会获得ConcurrentModificationException

如果您需要在面对addAll(list)的并发更新时以线程安全的方式执行list,那么您需要list一个CopyOnWriteArrayList

答案 2 :(得分:1)

java.util.concurrent中有一个并发列表实现。特别是CopyOnWriteArrayList

答案 3 :(得分:0)

如果您想将现有列表用作已同步列表,请转到Collections.synchronizedList(list)或创建目标列表,然后您可以转到CopyOnWriteArrayList

答案 4 :(得分:-1)

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

写集合上的副本从以下事实中获得线程安全性:由于正确发布了有效不可变对象,因此在访问它时不需要进一步同步。他们通过创建和实现可变性来实现可变性每次修改时都重新发布集合的新副本。无论后续修改如何,该集合都不会抛出ConcurrentModificationException。