nbsp; throw new NoSuchElementException();
return this.snapshot[(this.cursor++)];
}
}
CopyOnWriterArrayList的方法根本就没有像ArrayList中使用checkForComodification方法来判断expectedModCount 与 modCount 是否相等。它为什么会这么做,凭什么可以这么做呢?我们以add方法为例:
- public boolean add(E paramE) {
- ReentrantLock localReentrantLock = this.lock;
- localReentrantLock.lock();
- try {
- Object[] arrayOfObject1 = getArray();
- int i = arrayOfObject1.length;
- Object[] arrayOfObject2 = Arrays.copyOf(arrayOfObject1, i + 1);
- arrayOfObject2[i] = paramE;
- setArray(arrayOfObject2);
- int j = 1;
- return j;
- } finally {
- localReentrantLock.unlock();
- }
- }
-
-
- final void setArray(Object[] paramArrayOfObject) {
- this.array = paramArrayOfObject;
- }
CopyOnWriterArrayList的add方法与ArrayList的add方法有一个最大的不同点就在于,下面三句代码:
- Object[] arrayOfObject2 = Arrays.copyOf(arrayOfObject1, i + 1);
- arrayOfObject2[i] = paramE;
- setArray(arrayOfObject2);
就是这三句代码使得CopyOnWriterArrayList不会抛ConcurrentModificationException异常。他们所展现的魅力就在于copy原来的array,再在copy数组上进行add操作,这样做就完全