Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么java列表适用于addAll和clear上的线程安全_Java_Collections_Thread Safety - Fatal编程技术网

什么java列表适用于addAll和clear上的线程安全

什么java列表适用于addAll和clear上的线程安全,java,collections,thread-safety,Java,Collections,Thread Safety,我只调用addAll并清除列表,但需要线程安全,是否存在此列表?谢谢,列表未同步。 所以它不是线程安全的。 如果希望它是线程安全的,则意味着可以将列表设置为线程安全的,可以使用 使用集合创建的列表。synchronizedList(list list)将满足这些要求,前提是同步列表是addAll(…)调用中的目标对象,而不是参数 如果同步列表(如上所述创建)是参数,那么问题在于addAll(list)迭代参数list,而迭代同步列表不是原子的。如果另一个线程在添加时更新了列表,则可能会得到Con

我只调用addAll并清除列表,但需要线程安全,是否存在此列表?谢谢,列表未同步。 所以它不是线程安全的。 如果希望它是线程安全的,则意味着可以将列表设置为线程安全的,可以使用


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

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


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

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

如果您想将exsting列表用作同步列表,请转到集合。synchronizedList(list),或者您正在创建目标列表,然后您可以选择CopyOnWriteArrayList,它是synchronizedList的并发替代品,在某些常见情况下提供更好的并发性,并且无需在迭代期间锁定或复制集合


写时拷贝集合的线程安全性源于这样一个事实,即作为一个有效的不可变对象被正确发布,在访问它时不需要进一步的同步。它们通过每次修改集合时创建和重新发布集合的新副本来实现可变性。无论后续的修改如何,集合都不会抛出ConcurrentModificationException。

“线程安全”是一个大术语。如果两个线程同时调用addAll,那么不获取
ConcurrentModificationException
就足够了,还是需要在第二个线程的元素之前添加第一个线程的所有元素?如果您想要高质量、具体的答案,您确实需要添加有关场景的更多细节。