如何在Sets.newSetFromMap(map)上执行clone()

时间:2013-10-04 11:29:37

标签: java collections concurrency thread-safety clone

以前的代码就像;避免Vector上的 ConcurrentModificationException ;哪里需要迭代;它正在Vector上的synchronized块内执行。因此,通过使多个线程进入BLOCKED状态以在不同的API上获取对该Vector的锁定来达到非常差的性能。

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

因此将Vector更改为Concurrent集合后;我删除了所有SYNCH块。

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

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

3 个答案:

答案 0 :(得分:1)

  

但问题是我的一些代码正在执行clone()   矢量。

     

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

您现在正在使用Set,而不是Vector。您的SetConcurrentHashMap支持,因此可以安全地同时进行迭代。而不是克隆我建议你使用复制构造函数。

但请注意(来自javadocs):

  

但是,迭代器只能用于a的一个线程   时间。

话虽这么说,你也可以使用CopyOnWriteArrayList,但是你必须要小心,因为写入很昂贵且Iterator不支持元素更改操作。

  

Vector clone()是深度克隆还是浅层克隆?

Clone制作了引用的副本,因此很浅。

  

请告诉我Boolean的重要性   ConcurrentHashMap<psConference,Boolean>

Boolean值只是一个占位符,因为您使用Map作为Set。如果您查看Collection类的来源,您会看到在添加元素时始终使用Boolean.TRUESet的实际使用容器是Map#keySet()。所以Boolean参数在这里实际上没什么,只是一个占位符。

答案 1 :(得分:0)

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

此外,我宁愿使用ArrayList来替换Vector

为了回答你的观点(2),基于explanation,我会说Vector clone()可能是一个浅层克隆。顺便说一下,他们也说通常最好避免使用clone()方法。

答案 2 :(得分:0)

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

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