对于非受检异常,我们通常遇到最多的是NullPointerException,ArrayIndexOutOfBoundsException等异常。但是在多线程环境下,我们通常还会遇到ConcurrentModificationException。
考虑一个集合,比如Vector,当我们用foreach循环对其进行遍历时,如果另外一个线程对该集合进行添加或者删除操作。那么foreach循环该如何处理该问题呢?答案是抛出ConcurrentModificationException。其原理是Vector集合类包含一个内部类Itr,该类实现了Iterator,并且该类保存了其外部实例的modCount字段,在复写方法next(当然还有其它方法)时,它会检测该值是否发生变化,如果发生变化则抛出该异常:
- final void checkForComodification() {
- if (modCount != expectedModCount)
- throw new ConcurrentModificationException();
- }
下面写一个简单的例子,该例子会抛出ConcurrentModificationException。因为在遍历途中修改了modCount值。
- public static void main(String[] args) {
- Vector<String> v = new Vector<String>();
- v.add("a");
- v.add("b");
- for(String s : v) {
- System.out.println(s);
- v.add("c");
- }
- }
看下打印堆栈:
- a
- Exception in thread "main" java.util.ConcurrentModificationException
- at java.util.Vector$Itr.checkForComodification(Unknown Source)
- at java.util.Vector$Itr.next(Unknown Source)
- at org.reflect.Test.main(Test.java:14)