单核处理器还能抛出ConcurrentModificationException吗?
Can a single core processor still throw ConcurrentModificationException?
如果我在单核 PC 上生成 2 个线程,它是否会同时访问 ArrayList
,所以它会抛出 ConcurrentModificationException
?
我的直觉告诉我,虽然有2个线程,但它们无法实现真正的并行,因为只有一个内核,它主要能做的是从一个线程跳转到另一个线程,而不执行指令,例如arrayList.add(element)
同时。
TL;DR:是
List<String> myList = new ArrayList<String>(Arrays.asList("My string"));
Iterator<String> myIterator = myList.iterator();
myList.add("Another string");
myIterator.next();
结果:
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)
您不应该在遍历集合时修改集合。在实践中,当您在添加或删除元素后对迭代器调用 next()
时,ConcurrentModificationException
通常会出现(但不保证)。在实践中,当您在遍历集合的循环中添加或删除元素时,经常会发生这种情况,正如 Carciganicate 在评论中所说。
或者正如 ernest_k 在评论中所说的那样:
"Concurrent" in ConcurrentModificationException
is not really about
parallelism
Concurrency is not the same thing as parallel computing。两个活动(例如,两个线程)同时发生 如果两个活动都在其中一个完成之前启动。您不需要多个 CPU 即可实现。
但还要注意@ernest_k 在评论中所说的:您甚至不需要多个线程来让您的程序抛出 ConcurrentModificationException
。您需要做的就是为某个集合创建一个迭代器,然后修改该集合,然后在完成修改后尝试继续使用该迭代器。也就是说,如果您通过迭代并发修改集合,您将得到异常。
如果我在单核 PC 上生成 2 个线程,它是否会同时访问 ArrayList
,所以它会抛出 ConcurrentModificationException
?
我的直觉告诉我,虽然有2个线程,但它们无法实现真正的并行,因为只有一个内核,它主要能做的是从一个线程跳转到另一个线程,而不执行指令,例如arrayList.add(element)
同时。
TL;DR:是
List<String> myList = new ArrayList<String>(Arrays.asList("My string"));
Iterator<String> myIterator = myList.iterator();
myList.add("Another string");
myIterator.next();
结果:
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)
您不应该在遍历集合时修改集合。在实践中,当您在添加或删除元素后对迭代器调用 next()
时,ConcurrentModificationException
通常会出现(但不保证)。在实践中,当您在遍历集合的循环中添加或删除元素时,经常会发生这种情况,正如 Carciganicate 在评论中所说。
或者正如 ernest_k 在评论中所说的那样:
"Concurrent" in
ConcurrentModificationException
is not really about parallelism
Concurrency is not the same thing as parallel computing。两个活动(例如,两个线程)同时发生 如果两个活动都在其中一个完成之前启动。您不需要多个 CPU 即可实现。
但还要注意@ernest_k 在评论中所说的:您甚至不需要多个线程来让您的程序抛出 ConcurrentModificationException
。您需要做的就是为某个集合创建一个迭代器,然后修改该集合,然后在完成修改后尝试继续使用该迭代器。也就是说,如果您通过迭代并发修改集合,您将得到异常。