首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单核处理器还能抛出ConcurrentModificationException吗?

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

Stack Overflow用户
提问于 2020-11-01 18:15:20
回答 2查看 129关注 0票数 2

如果我在单个核心PC上生成2个线程,那么它是否在同一时间访问过一个ArrayList,因此它会抛出ConcurrentModificationException

我的直觉告诉我,虽然有两个线程,但它们无法实现真正的并行性,因为只有一个内核,它所能做的主要是从一个线程跳转到另一个线程,而不同时执行诸如arrayList.add(element)这样的指令。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-01 18:20:25

TL;DR:是的

代码语言:javascript
复制
    List<String> myList = new ArrayList<String>(Arrays.asList("My string"));
    Iterator<String> myIterator = myList.iterator();
    myList.add("Another string");
    myIterator.next();

结果:

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)上线程"main“java.util.ConcurrentModificationException中的

异常

您不应该在迭代集合的同时修改它。在实践中,当您在添加或删除元素之后在迭代器上调用next()时,next()通常会出现(但不能保证)。在实践中,当您在循环中添加或删除元素时,经常会发生这种情况,就像Carciganicate在注释中所说的那样。

或者正如ernest_k在评论中所说的那样:

ConcurrentModificationException中的“并发”并不是真正的并行性

票数 14
EN

Stack Overflow用户

发布于 2020-11-01 20:30:36

与不是一回事。两个活动(例如,两个线程)同时发生,如果这两个活动都是在两个线程完成之前启动的。您不需要多个CPU才能做到这一点。

但是还要注意@ernest_k在评论中说的话:为了让程序抛出一个ConcurrentModificationException,您甚至不需要有多个线程。您所需要做的就是为某些集合创建一个迭代器,然后修改集合,然后在完成修改后继续使用迭代器。也就是说,如果您与迭代并发地修改集合,您将得到异常。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64635319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档