如何解决单个核心处理器是否仍可以引发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)
在迭代集合时,您不应修改它。实际上,当您在添加元素或删除元素后在迭代器上调用ConcurrentModificationException
时,next()
通常会出现(但不能保证)。实际上,如Carciganicate在评论中所述,当您在循环遍历集合的循环中添加或删除元素时,通常会发生这种情况。
或者正如ernest_k在评论中所说的那么好:
,
ConcurrentModificationException
中的“并发”不是真的 并行性
Concurrency与parallel computing不同。如果两个活动(例如,两个线程)在两个活动中的任何一个结束之前都已开始,则这两个活动会同时发生。您不需要多个CPU即可实现。
还要注意@ernest_k在评论中说的内容:您甚至不需要多个线程即可让程序抛出.
。您需要做的就是为某个集合创建一个迭代器,然后修改集合,然后在完成修改后尝试继续使用迭代器。也就是说,如果您通过迭代同时修改集合 ,将会得到异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。