Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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并发修改异常(枚举器)_Java - Fatal编程技术网

Java并发修改异常(枚举器)

Java并发修改异常(枚举器),java,Java,我对这个源代码有问题。 外部for循环不会迭代: java.util.ConcurrentModificationException 在java.util.Hashtable$Enumerator.next(Hashtable.java:1387)我想,但我不确定: iteratingHashTable = myVar; 正在引用同一对象,因此当在下面的代码中尝试对不同的操作使用myVar和iteratingHashTable时,您总是使用同一对象。我想,但我不确定: iteratingHa

我对这个源代码有问题。 外部for循环不会迭代:

java.util.ConcurrentModificationException

在java.util.Hashtable$Enumerator.next(Hashtable.java:1387)
我想,但我不确定:

iteratingHashTable = myVar;

正在引用同一对象,因此当在下面的代码中尝试对不同的操作使用
myVar
iteratingHashTable
时,您总是使用同一对象。

我想,但我不确定:

iteratingHashTable = myVar;
正在引用相同的对象,因此在下面的代码中,当您尝试使用
myVar
iteratingHashTable
进行不同的操作时,您总是使用相同的对象。

  • Java集合类是快速失效的,这意味着如果在某个线程遍历集合时该集合将被更改,迭代器.next()将抛出ConcurrentModificationException

  • 在本例中,您正在迭代哈希表并更改哈希表的值,因此引发此异常。当您指定iteratingHashTable=myVar时;两个变量都指向相同的值

  • 您可以通过以下方式避免此异常:

    1) 如果您使用>=JDK1.5,则可以使用ConcurrentHashMap和CopyOnWriteArrayList(推荐方法)

    2) 可以使用synchronized块在迭代时锁定表

      • Java集合类是快速失效的,这意味着如果在某个线程遍历集合时该集合将被更改,迭代器.next()将抛出ConcurrentModificationException

      • 在本例中,您正在迭代哈希表并更改哈希表的值,因此引发此异常。当您指定iteratingHashTable=myVar时;两个变量都指向相同的值

      • 您可以通过以下方式避免此异常:

        1) 如果您使用>=JDK1.5,则可以使用ConcurrentHashMap和CopyOnWriteArrayList(推荐方法)

        2) 可以使用synchronized块在迭代时锁定表


      如果在创建迭代器后的任何时候,以迭代器自己的remove方法以外的任何方式修改哈希表的结构,迭代器将抛出ConcurrentModificationException

      使用普通集合类(而不是并发集合类)时,不允许对for循环中的列表进行任何修改。因为快速失败的行为。这意味着,在迭代集合项时,如果您对同一列表或映射进行任何修改,它将抛出concurrentModificationException


      要解决上述问题,请使用concurrentHashMap或再创建一个hashMap,在该映射中添加或替换这些元素,并在for循环完成后将这些元素添加到原始映射中。

      如果在创建迭代器后的任何时间,以迭代器自己的remove方法以外的任何方式修改哈希表的结构,迭代器将抛出ConcurrentModificationException

      使用普通集合类(而不是并发集合类)时,不允许对for循环中的列表进行任何修改。因为快速失败的行为。这意味着,在迭代集合项时,如果您对同一列表或映射进行任何修改,它将抛出concurrentModificationException


      要解决上述问题,请使用concurrentHashMap或再创建一个hashMap,并在该映射中添加或替换这些元素,在for循环完成后,将这些元素添加到原始映射。

      您是否同时从多个线程访问myvar?旁注:如果您想以这种方式进行迭代,可能HashMap不是理想的数据结构?即使使用不同的变量,您也会修改同一个对象。您是否同时从多个线程访问myvar?旁注:如果您想以这种方式进行迭代,可能HashMap不是理想的数据结构。即使您使用不同的变量,也可以修改相同的对象。您是对的。您没有复制对象,只是复制对它的引用。正因为如此,两个变量都在访问同一个对象。你是对的。您没有复制对象,只是复制对它的引用。因此,这两个变量访问的是同一个对象。