以前的代码就像;避免Vector上的 ConcurrentModificationException ;哪里需要迭代;它正在Vector上的synchronized块内执行。因此,通过使多个线程进入BLOCKED状态以在不同的API上获取对该Vector的锁定来达到非常差的性能。
我决定在项目中将Vector
替换为Collections.newSetFromMap(new ConcurrentHashMap<psConference,Boolean>());
。
因此将Vector更改为Concurrent集合后;我删除了所有SYNCH块。
但问题是我的一些代码正在对Vector执行clone()。
ConcurrentHashMap<psConference,Boolean>
答案 0 :(得分:1)
但问题是我的一些代码正在执行clone() 矢量。
如何在这里做同样的事情,因为我只有Set界面?
您现在正在使用Set
,而不是Vector
。您的Set
由ConcurrentHashMap
支持,因此可以安全地同时进行迭代。而不是克隆我建议你使用复制构造函数。
但请注意(来自javadocs):
但是,迭代器只能用于a的一个线程 时间。
话虽这么说,你也可以使用CopyOnWriteArrayList,但是你必须要小心,因为写入很昂贵且Iterator
不支持元素更改操作。
Vector clone()是深度克隆还是浅层克隆?
Clone制作了引用的副本,因此很浅。
请告诉我
Boolean
的重要性ConcurrentHashMap<psConference,Boolean>
Boolean
值只是一个占位符,因为您使用Map
作为Set
。如果您查看Collection
类的来源,您会看到在添加元素时始终使用Boolean.TRUE
。 Set
的实际使用容器是Map#keySet()
。所以Boolean
参数在这里实际上没什么,只是一个占位符。
答案 1 :(得分:0)
就个人而言,我希望尽可能避免并发问题。您是否可以发送一个抛出ConcurrentModificationException
的代码示例?可能有一种方法可以重新设计算法来避免它们。
此外,我宁愿使用ArrayList
来替换Vector
。
为了回答你的观点(2),基于explanation,我会说Vector clone()
可能是一个浅层克隆。顺便说一下,他们也说通常最好避免使用clone()
方法。
答案 2 :(得分:0)
请记住,集合的并发版本不会自动使并发错误消失。
尽管如此,在您的情况下,您最好的选择是创建实现您期望的集合接口的具体包装类,将所有必要的方法委托给包装集合,但要知道所使用的数据类型并知道如何创建副本自己。