Java 如何在set.newSetFromMap(map)上执行clone()
以前的代码是这样的;避免向量上的ConcurrentModificationException;需要迭代的地方;它在那个向量上的同步块内执行。因此,它让多个线程进入阻塞状态,从而在不同的API上获得该向量的锁,从而导致性能非常差 我决定将Java 如何在set.newSetFromMap(map)上执行clone(),java,collections,concurrency,thread-safety,clone,Java,Collections,Concurrency,Thread Safety,Clone,以前的代码是这样的;避免向量上的ConcurrentModificationException;需要迭代的地方;它在那个向量上的同步块内执行。因此,它让多个线程进入阻塞状态,从而在不同的API上获得该向量的锁,从而导致性能非常差 我决定将Vector替换为Collections.newSetFromMap(新的ConcurrentHashMap())在我的项目中 因此,将向量转换为并发集合后;我已删除所有同步块 但这里的问题是,我的一些代码正在该向量上执行clone() 既然我只设置了接口,如何
Vector
替换为Collections.newSetFromMap(新的ConcurrentHashMap())代码>在我的项目中
因此,将向量转换为并发集合后;我已删除所有同步块
但这里的问题是,我的一些代码正在该向量上执行clone()
既然我只设置了接口,如何在这里执行相同的操作李>
Vector clone()是深度克隆还是浅层克隆
另外,请告诉我布尔值在ConcurrentHashMap
就我个人而言,我希望尽可能避免并发问题。您是否可以发送一个抛出ConcurrentModificationException
的代码示例?也许有一种方法可以重新设计算法来避免它们
另外,我宁愿使用
来替换向量
为了回答你的观点(2),基于此,我想说Vectorclone()
可能是一个浅层克隆。顺便说一句,他们还说通常最好避免使用clone()
方法。请记住,集合的并发版本不会自动消除并发bug
不过,在您的情况下,最好的办法是创建具体的包装器类来实现您期望的集合接口,将所有必要的方法委托到包装的集合中,但要知道使用的数据类型,并知道如何创建它们自己的副本
但这里的问题是,我的一些代码正在对其执行clone()
向量
既然我只设置了接口,如何在这里执行相同的操作
您现在使用的是集合
,而不是向量
。您的集合
由ConcurrentHashMap
支持,因此可以安全地同时进行迭代。我建议您使用复制构造函数而不是克隆
但要注意(从以下方面):
但是,迭代器设计为一次只能由一个线程使用
时间
也就是说,您也可以使用a,但在这里必须小心,因为写入非常昂贵,迭代器不支持元素更改操作
Vector clone()是深度克隆还是浅层克隆
克隆会复制引用,因此很浅
另外,请告诉我Boolean
at的意义
ConcurrentHashMap
Boolean
值只是一个占位符,因为您使用的是Map
作为Set
。如果查看集合
类的源代码,您将看到添加元素时始终使用Boolean.TRUE
。集合的实际使用的容器是映射#键集()
。因此,Boolean
参数在这里实际上什么都不做,只是一个占位符。谢谢!本;但是,必须用另一个同步集合替换同步集合,以确保线程安全。为了在多线程环境中获得更好的性能,使用ConcurrentHashMap而不是Hashtable是个好主意。非常感谢!!!!我不知道“迭代器被设计为一次只能由一个线程使用”这一点。我认为多个迭代器可以同时用于多个线程。我的错!!!!亲爱的@ortang;你能同时回答我的相关问题吗