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

标签 java collections concurrency thread-safety clone

之前的代码就像;避免 Vector 上的 ConcurrentModificationException ;任何需要迭代的地方;它在该 Vector 上的同步块(synchronized block)内执行。因此,通过使多个线程进入 BLOCKED 状态以在不同的 API 上获取该 Vector 的锁定,性能会非常差。

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

所以将Vector改为Concurrent集合后;我已经删除了所有同步块(synchronized block)。

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

  1. 由于我只有设置界面,如何在这里执行相同的操作?
  2. Vector clone() 是深克隆还是浅克隆?
  3. 另外请告诉我 boolean 值的重要性 ConcurrentHashMap<psConference,Boolean>

最佳答案

But the problem here is some of my code is performing clone() on that Vector.

How to do the same on here since i have only Set interface ?

您正在使用Set现在,不是Vector 。您的SetConcurrentHashMap 支持,因此并发迭代是安全的。我建议您使用复制构造函数,而不是克隆。

但请注意(来自 javadocs ):

However, iterators are designed to be used by only one thread at a time.

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

Vector clone() is Deep cloning or Shallow cloning?

克隆会复制引用,因此是浅层的。

Also pls tell me the significance of Boolean at ConcurrentHashMap<psConference,Boolean>

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

关于java - 如何在 Sets.newSetFromMap(map) 上执行clone(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180106/

相关文章:

java - 仅使用 JDK (6) 提供的类来改进该代码的方法? (并发、线程安全)

java - 多线程等待批量操作

java - 使用 DecimalFormat 时如何防止小数被舍入?

java - Maven 抛出 "java.lang.OutOfMemoryError"

java - 按对象属性值查找

Java - 寻找比 PriorityQueue 更快的东西

具有停止条件的 Java 生产者-消费者

java - 将 JRuby 与 libGDX 桌面可运行 JAR 结合使用

java - hibernate session 和 DAO 的最佳实践是什么

.net - IEnumerator<T>.Current 和 IEnumerator.Current 之间的关系以及为什么 IEnumerator<T> 实现 IDisposable