我需要让对列表的arraylist中线的安全。我也不可能有客户作出改变的集合。将不可修改的包装,使它线的安全或者我需要两封皮上集合?

有帮助吗?

解决方案

它依赖。包装只会阻止更改收集它包裹,不要对象。如果你有一个数组列表的arraylist中,全球清单,以及它的每一个元件列出了需要单独包裹,你还可能需要做一些对的内容的那些清单。最后,你必须确保原始名单的对象是没有改变,由于包装不仅可以防止通过改变包装纸的参考,不是原始对象。

你不需要同步的包装在这种情况。

其他提示

在一个相关的议题-我见过几个答复表明,使用同步收集为了达到线的安全。使用同步版本的收集不让它"thread safe"-虽然每一个操作(插入,数等) 为保护通过互斥在合并两个行动是没有保证,他们将执行原子.例如下列代码不是线的安全(甚至与一个同步的队列):

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

这不可修改的包装纸仅可以防止更改以结构清单,它适用。如果这列表中包含的其他清单和你的有线试图修改这些嵌套清单,然后你是不是保护的对并行修改的风险。

看收藏品来源,它看起来像并不可修改的 让它保持同步。

static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
                 implements Set<E>, Serializable;

static class UnmodifiableCollection<E> implements Collection<E>, Serializable;

同步的类包装有一个互斥的对象,在他们要做的同步部分,因此看来你需要使用都得到两个。或滚你自己!

我认为,因为UnmodifiableList包装商店的。一最后的领域,任何读取的方式包装纸上会看到的名单,因为它是当包装物构成的,只要该名单是不是修改后的包装是创建的,并且只要可变arraylist中的内部包装不是修改(其中包装不能防止).

这将是线的安全,如果不可修改的观点是安全的出版,并可修改原来的是永远不会修改(包括所有对象递归中包含的集合!) 之后公布的不可修改的图。

如果你想保留的修改原始,然后您可以创建一个防御的副本,对象图收集和返回的一个不可修改的视图,或使用的一个固有的线安全的清单开始,返回一个不可修改的图。

你的 不能 返回unmodifiableList(synchonizedList(则将列表)),如果你还打算访问则将列表不同步之后;如果可变的状态之间共享多线程,然后 所有 线必须同步 锁在他们访问该国。

一个不变的目的是通过定义线的安全(假设没有一个保留提及原始的集合),以同步 必要的。

包裹在外。使用集。unmodifiableList() 防止客户从改变其内容(和因此使得它纹 安全),但内arraylist中仍然是可变的。

包裹内arraylist中使用的集合。unmodifiableList()太 防止客户从改变它们的内容(和因此使得他们 线的安全),其中你需要的是什么。

让我们知道,如果这种方案引起的问题(开销、存储器使用等);其他解决方案可能适用于你的问题。:)

编辑:当然,如果列出了修改他们不是线的安全。我假定没有进一步的编辑。

不知道,如果我理解你正在尝试这样做,但我敢说答案在大多数情况下是"没有"。

如果你设置一。的。以及两者的外部和内部列出了可能永远不会改变后建立(和创建期间只有一线将已经进入内部和外部列出),他们可能线的安全通过一种包装机(如果两个,外部和内部名单包裹在这样一种方式,修改它们是不可能)。所有的只读操作上arraylist中是最有可能的线的安全。然而,太阳不 保证 他们应线安全的(还不用只读操作),因此尽管它可能会工作,现在,它可能会破坏在未来(如果太阳创建内部的一些高速缓存的数据,以更快的访问为例)。

这是必要的,如果:

  1. 还有一个参照的原始修改的列表。
  2. 该清单将可能访问的一个迭代器。

如果你打算从中读取。通过索引只有你可以假设这是线的安全。

有疑问时,选择了同步的包装。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top