Java 单核处理器还能抛出ConcurrentModificationException吗?
如果我在一台单核PC上生成2个线程,它是否会同时访问例如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
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)