Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在set.newSetFromMap(map)上执行clone()_Java_Collections_Concurrency_Thread Safety_Clone - Fatal编程技术网

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

Java 如何在set.newSetFromMap(map)上执行clone(),java,collections,concurrency,thread-safety,clone,Java,Collections,Concurrency,Thread Safety,Clone,以前的代码是这样的;避免向量上的ConcurrentModificationException;需要迭代的地方;它在那个向量上的同步块内执行。因此,它让多个线程进入阻塞状态,从而在不同的API上获得该向量的锁,从而导致性能非常差 我决定将Vector替换为Collections.newSetFromMap(新的ConcurrentHashMap())在我的项目中 因此,将向量转换为并发集合后;我已删除所有同步块 但这里的问题是,我的一些代码正在该向量上执行clone() 既然我只设置了接口,如何

以前的代码是这样的;避免向量上的ConcurrentModificationException;需要迭代的地方;它在那个向量上的同步块内执行。因此,它让多个线程进入阻塞状态,从而在不同的API上获得该向量的锁,从而导致性能非常差

我决定将
Vector
替换为
Collections.newSetFromMap(新的ConcurrentHashMap())在我的项目中

因此,将向量转换为并发集合后;我已删除所有同步块

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

  • 既然我只设置了接口,如何在这里执行相同的操作
  • Vector clone()是深度克隆还是浅层克隆
  • 另外,请告诉我布尔值在
    ConcurrentHashMap

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

    另外,我宁愿使用
    来替换
    向量


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

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

    不过,在您的情况下,最好的办法是创建具体的包装器类来实现您期望的集合接口,将所有必要的方法委托到包装的集合中,但要知道使用的数据类型,并知道如何创建它们自己的副本

    但这里的问题是,我的一些代码正在对其执行clone() 向量

    既然我只设置了接口,如何在这里执行相同的操作

    您现在使用的是
    集合
    ,而不是
    向量
    。您的
    集合
    ConcurrentHashMap
    支持,因此可以安全地同时进行迭代。我建议您使用复制构造函数而不是克隆

    但要注意(从以下方面):

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

    也就是说,您也可以使用a,但在这里必须小心,因为写入非常昂贵,
    迭代器不支持元素更改操作

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

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

    另外,请告诉我
    Boolean
    at的意义
    ConcurrentHashMap


    Boolean
    值只是一个占位符,因为您使用的是
    Map
    作为
    Set
    。如果查看
    集合
    类的源代码,您将看到添加元素时始终使用
    Boolean.TRUE
    集合的实际使用的容器是
    映射#键集()
    。因此,
    Boolean
    参数在这里实际上什么都不做,只是一个占位符。

    谢谢!本;但是,必须用另一个同步集合替换同步集合,以确保线程安全。为了在多线程环境中获得更好的性能,使用ConcurrentHashMap而不是Hashtable是个好主意。非常感谢!!!!我不知道“迭代器被设计为一次只能由一个线程使用”这一点。我认为多个迭代器可以同时用于多个线程。我的错!!!!亲爱的@ortang;你能同时回答我的相关问题吗