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; }