Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 单核处理器还能抛出ConcurrentModificationException吗?_Java_Multithreading_Multicore_Concurrentmodification - Fatal编程技术网

Java 单核处理器还能抛出ConcurrentModificationException吗?

Java 单核处理器还能抛出ConcurrentModificationException吗?,java,multithreading,multicore,concurrentmodification,Java,Multithreading,Multicore,Concurrentmodification,如果我在一台单核PC上生成2个线程,它是否会同时访问例如ArrayList,从而抛出ConcurrentModificationException 我的直觉告诉我,虽然有两个线程,但它们无法实现真正的并行性,因为只有一个内核,它能做的主要事情是从一个线程跳到另一个线程,但不同时执行诸如arrayList.add(element);医生:是的 List<String> myList = new ArrayList<String>(Arrays.asList(&quo

如果我在一台单核PC上生成2个线程,它是否会同时访问例如
ArrayList
,从而抛出
ConcurrentModificationException

我的直觉告诉我,虽然有两个线程,但它们无法实现真正的并行性,因为只有一个内核,它能做的主要事情是从一个线程跳到另一个线程,但不同时执行诸如
arrayList.add(element)
;医生:是的

    List<String> myList = new ArrayList<String>(Arrays.asList("My string"));
    Iterator<String> myIterator = myList.iterator();
    myList.add("Another string");
    myIterator.next();
您不应该在迭代集合时修改它。实际上,
ConcurrentModificationException
通常在添加或删除元素后在迭代器上调用
next()
时出现(但不能保证)。实际上,正如Carciganicate在评论中所说,在循环遍历集合的过程中添加或删除元素时,经常会发生这种情况

或者正如欧内斯特•克在评论中所说:

ConcurrentModificationException
中的“Concurrent”实际上与 平行性

这和我的想法不一样。如果两个活动(例如,两个线程)都在其中一个活动完成之前启动,则两个活动(例如,两个线程)同时发生。您不需要多个CPU来实现这一点

但也要注意@ernest_k在评论中说的话:你甚至不需要有多个线程就可以让你的程序抛出一个
ConcurrentModificationException
。您所需要做的就是为某个集合创建一个迭代器,然后修改该集合,然后在完成修改后尝试继续使用迭代器。也就是说,如果在迭代过程中同时修改集合,则会出现异常。

ConcurrentModificationException中的“Concurrent”实际上与并行性无关(即使对数据的并发访问是它的典型场景)。异常的条件是在迭代开始之后和结束之前(所有这些都可以在单个线程中发生)修改集合时创建的。为了使其特定于迭代,也许我们最好将其称为
ModificationDuringIterationException
Exception in thread "main" java.util.ConcurrentModificationException
  at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
  at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
  at com.ajax.YourClass.yourMethod(YourClass.java:134)