我需要使ArrayLists的ArrayList线程安全.我也无法让客户对集合进行更改.不可修改的包装器是否会使其线程安全,或者我需要在集合上使用两个包装器?
这取决于.包装器只会阻止对它包装的集合的更改,而不是对集合中的对象的更改.如果您有ArrayList的ArrayList,则需要单独包装全局List及其每个元素列表,并且您可能还必须对这些列表的内容执行某些操作.最后,您必须确保原始列表对象不会更改,因为包装器仅阻止通过包装器引用而不是原始对象进行更改.
在这种情况下,您不需要同步包装器.
在一个相关的主题 - 我已经看到几个回复建议使用同步收集,以实现线程安全.使用集合的同步版本并不会使其"线程安全" - 尽管每个操作(插入,计数等)在组合两个操作时都受到互斥锁的保护,但不能保证它们会以原子方式执行.例如,以下代码不是线程安全的(即使使用同步队列):
if(queue.Count > 0) { queue.Add(...); }