JDK1.6中CopyOnWriteArrayList源码阅读

CopyOnWriteArrayList是一个线程安全的类,线程安全实现的机制是ArrayList上所有的写操作,都在原来ArrayList底层数组的一个copy上,并且所有的写操作都同步。

** The lock protecting all mutators */
transient final ReentrantLock lock = new ReentrantLock();//写的同步锁,可以通过继承获取该锁,
可以通过继承扩展该类的对底层数组写方法

/** The array, accessed only via getArray/setArray. */
private volatile transient Object[] array; //底层数组

 add方法:

public boolean add(E e) {
	final ReentrantLock lock = this.lock;//获取同步锁
	lock.lock();
	try {
	    Object[] elements = getArray();//获取底层数组
	    int len = elements.length;
	    Object[] newElements = Arrays.copyOf(elements, len + 1); //复制底层数组
	    newElements[len] = e;
	    setArray(newElements);//修改底层数组
	    return true;
	} finally {
	    lock.unlock();
	}
    }

 contains方法:

   public boolean containsAll(Collection<?> c) {
        Object[] elements = getArray();//获取底层数组,注意,读的过程中,底层数组可能已经被修改,一致性遭到破坏
        int len = elements.length;
	for (Object e : c) {
            if (indexOf(e, elements, 0, len) < 0)
                return false;
	}
        return true;
    }

猜你喜欢

转载自chenghao666.iteye.com/blog/2415934