理解ConcurrentModificationException

当一个线程对类集进行迭代时,如果另一个线程修改了类集,迭代线程会发现这个修改,然后就会抛出ConcurrentModificationException .

不过即使出现了上面所说的并发读写,java类集也不能100%保证会抛出ConcurrentModificationException.  因为迭代线程在执行“判断类集是否修改 + 若有则抛出异常”这两步的组合时并没有加锁。 很有可能在 “发现类集没有修改后”, 另一个线程把类集修改了。

另一个要注意的是很多非迭代操作都可能引发ConcurrentModificationException, 因为这些操作隐式地调用了迭代。 比如 类集的hashCode(),equals(), containsAll()等,就连toString()都会,所以,在日志里直接打印类集时,要小心。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.