Java集合的不可修改的包装器是否使它们具有线程安全性?

我需要使 ArrayList 的 ArrayLists 线程安全。我也不能让客户端对集合进行更改。不可修改的包装器是使其线程安全,还是集合上需要两个包装器?


答案 1

这要视情况而定。包装器只会阻止对它包装的集合进行更改,而不会阻止对集合中的对象进行更改。如果您有一个 ArrayList 的 ArrayList,则全局 List 及其每个元素 Lists 都需要单独包装,您可能还必须对这些列表的内容执行一些操作。最后,您必须确保原始列表对象未被更改,因为包装器仅阻止通过包装器引用进行更改,而不会阻止对原始对象的更改。

在这种情况下,您不需要同步的包装器。


答案 2

关于一个相关的主题 - 我看到一些回复建议使用同步收集来实现线程安全。使用集合的同步版本并不能使其“线程安全” - 尽管在组合两个操作时,每个操作(插入,计数等)都受互斥锁保护,但不能保证它们会以原子方式执行。例如,以下代码不是线程安全的(即使使用同步队列):

if(queue.Count > 0)
{
   queue.Add(...);
}