对于非受检异常,我们通常遇到最多的是NullPointerException,ArrayIndexOutOfBoundsException等异常。但是在多线程环境下,我们通常还会遇到ConcurrentModificationException。

考虑一个集合,比如Vector,当我们用foreach循环对其进行遍历时,如果另外一个线程对该集合进行添加或者删除操作。那么foreach循环该如何处理该问题呢?答案是抛出ConcurrentModificationException。其原理是Vector集合类包含一个内部类Itr,该类实现了Iterator,并且该类保存了其外部实例的modCount字段,在复写方法next(当然还有其它方法)时,它会检测该值是否发生变化,如果发生变化则抛出该异常:

Java代码
  1. final void checkForComodification() {
  2. if (modCount != expectedModCount)
  3. throw new ConcurrentModificationException();
  4. }

 

下面写一个简单的例子,该例子会抛出ConcurrentModificationException。因为在遍历途中修改了modCount值。

Java代码
  1. public static void main(String[] args) {
  2. Vector<String> v = new Vector<String>();
  3. v.add("a");
  4. v.add("b");
  5. for(String s : v) {
  6. System.out.println(s);
  7. v.add("c");
  8. }
  9. }

看下打印堆栈:

Command代码
  1. a
  2. Exception in thread "main" java.util.ConcurrentModificationException
  3. at java.util.Vector$Itr.checkForComodification(Unknown Source)
  4. at java.util.Vector$Itr.next(Unknown Source)
  5. at org.reflect.Test.main(Test.java:14)