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

标签 java multithreading multicore concurrentmodification

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

我的直觉告诉我,虽然有 2 个线程,但它们无法实现真正​​的并行性,因为只有一个内核,它主要能做的是从一个线程跳转到另一个线程,而不执行诸如 arrayList 之类的指令。同时添加(元素)

最佳答案

总而言之:是的

    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 在评论中所说的那样:

"Concurrent" in ConcurrentModificationException is not really about parallelism

关于java - 单核处理器还能抛出ConcurrentModificationException吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64635319/

相关文章:

java - 每当日期从 DatePicker 更改时显示文本

java - 过多的线程在 Android 中是个坏主意吗?

arm - 在 Zynq 上使用多核

java - 关于创建可通过 CMS 更新的屏幕保护程序的建议

Java接口(interface)继承与扩展

java - 同步静态方法和静态方法内的同步块(synchronized block)之间的区别?

multicore - 如何将进程绑定(bind)到 freebsd/linux 中的特定内核

macos - Mac OS X shell 实用程序,显示多核系统中各个 CPU 的使用情况

java - 在运行时替换 Java 对象

.net - ConcurrentQueue(Of T) VS List(Of T) 在多线程应用程序中使用 Synclock 语句