0

以前的代码是这样的;避免在 Vector 上出现ConcurrentModificationException ;需要迭代的地方;它在该 Vector 上的同步块内执行。因此,通过使多个线程进入 BLOCKED 状态以在不同的 API 上获取对该 Vector 的锁定,它的性能非常差。

我决定在我的项目中替换Vector为。Collections.newSetFromMap(new ConcurrentHashMap<psConference,Boolean>());

所以将 Vector 改成 Concurrent 集合后;我已经删除了所有同步块。

但这里的问题是我的一些代码正在对该 Vector 执行 clone()。

  1. 由于我只有 Set 界面,如何在这里做同样的事情?
  2. Vector clone() 是深度克隆还是浅层克隆?
  3. 另外请告诉我布尔值的意义ConcurrentHashMap<psConference,Boolean>
4

3 回答 3

1

但这里的问题是我的一些代码正在对该 Vector 执行 clone()。

由于我只有 Set 界面,如何在这里做同样的事情?

您正在使用 a Setnow,而不是 a Vector。您Set由 a 支持ConcurrentHashMap,因此可以安全地同时迭代。而不是克隆,我建议您使用复制构造函数。

但请注意(来自javadocs):

但是,迭代器被设计为一次只能由一个线程使用。

话虽如此,您也可以使用CopyOnWriteArrayList,但您必须小心,因为写入成本很高,并且Iterator不支持元素更改操作。

vector clone() 是深克隆还是浅克隆?

克隆复制引用,因此很浅。

也请告诉我Booleanat 的意义ConcurrentHashMap<psConference,Boolean>

Boolean值只是一个占位符,因为您将 aMap用作Set. 如果您查看Collection该类的源代码,您会发现Boolean.TRUE在添加元素时始终使用它。实际使用的容器SetMap#keySet(). 所以Boolean参数在这里实际上什么都不做,只是一个占位符。

于 2013-10-04T18:12:57.697 回答
0

就个人而言,我更愿意尽可能避免并发问题。您能否发送一个抛出的代码示例ConcurrentModificationException?也许有一种方法可以重新设计算法来避免它们。

另外,我宁愿ArrayList用来替换Vector.

为了回答你的观点 (2),基于这个解释,我会说 Vectorclone()可能是一个浅克隆。顺便说一句,他们还说通常最好避免使用clone()方法。

于 2013-10-04T11:56:21.793 回答
0

请记住,集合的并发版本不会自动消除并发错误。

尽管如此,在您的情况下,您最好的选择是创建实现您期望的集合接口的具体包装类,将所有必要的方法委托给包装的集合,但知道使用的数据类型并知道如何创建它们自己的副本。

于 2013-10-04T15:34:08.087 回答