在用一个线程修改ArrayList并用另一个线程迭代它时,它会抛出ConcurrentModificationException

时间:2017-02-03 19:23:14

标签: multithreading iterator concurrentmodification

我正在尝试下面的代码。

{doj: {$lt:dt}}

有时会抛出ConcurrentModificationException并且有时会成功运行。

我不明白的是,因为有两种不同的方法,每种方法都包含一个线程。他们将逐一执行。当一个线程完成修改列表时,线程2将开始迭代。

我也提到了这个链接(Why no ConcurrentModificationException when one thread iterating (using Iterator) and other thread modifying same copy of non-thread-safe ArrayList),但情况不同。

那么,为什么会抛出这个例外?是因为线程吗?

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

您正在启动两个线程,然后不再进一步同步。

有时,两个线程将同时运行,您将获得CME。其他时候,第一个线程将在第二个线程实际开始执行之前完成。在那种情况下,不会获得CME。

您获得变化的原因很可能是系统负载等问题。或者它可能只是由于线程调度程序是非确定性的。

与创建/启动线程的开销相比,您的线程实际上做了很少的工作。因此,其中一个人可以很快从其run()方法返回就不足为奇了。