/** * The lock protecting all mutators * 重入锁 */ finaltransientReentrantLocklock=newReentrantLock();
/** * The array, accessed only via getArray/setArray. * 只能通过 getArray/setArray 访问的数组 */ privatetransientvolatile Object[] array;
/** * Gets the array. Non-private so as to also be accessible * from CopyOnWriteArraySet class. * 获取数组,非私有方法以便于CopyOnWriteArraySet类的访问 */ final Object[] getArray() { return array; }
/** * Sets the array. * 设置数组 */ finalvoidsetArray(Object[] a) { array = a; }
get
直接操作原数组,并发读时,可保证吞吐量。
1 2 3 4 5 6 7 8 9
/** * {@inheritDoc} * 获取原数组中元素 * * @throws IndexOutOfBoundsException {@inheritDoc} */ public E get(int index) { return get(getArray(), index); }
/** * Appends the specified element to the end of this list. * 将指定的元素追加到此列表的末尾。 * * @param e element to be appended to this list 要附加到此列表中的元素 * @return {@code true} (as specified by {@link Collection#add}) */ publicbooleanadd(E e) { //获取重入锁 finalReentrantLocklock=this.lock; //锁定 lock.lock(); try { //获取原数组 Object[] elements = getArray(); intlen= elements.length; //原数组拷贝 并增加一个空位 Object[] newElements = Arrays.copyOf(elements, len + 1); //将指定元素增加到新数组新增的空位中 newElements[len] = e; //新数组替换原数组 setArray(newElements); //返回成功 returntrue; } finally { lock.unlock(); } }
/** * Replaces the element at the specified position in this list with the * specified element. * 用指定的元素替换列表中指定位置的元素。 * * @throws IndexOutOfBoundsException {@inheritDoc} */ public E set(int index, E element) { //获取当前锁 finalReentrantLocklock=this.lock; //锁定 lock.lock(); try { //获取原数组 Object[] elements = getArray(); //获取老的值 EoldValue= get(elements, index);
/** * Removes the element at the specified position in this list. * Shifts any subsequent elements to the left (subtracts one from their * indices). Returns the element that was removed from the list. * <p> * 移除列表中指定位置的元素。 * 将任何后续元素向左移动(从它们的索引中减去一个)。 * 返回从列表中删除的元素。 * * @throws IndexOutOfBoundsException {@inheritDoc} */ public E remove(int index) { //获取锁并且锁定 finalReentrantLocklock=this.lock; lock.lock(); try { //获取原数组 Object[] elements = getArray(); intlen= elements.length; //获取要删除的元素值 EoldValue= get(elements, index); //要移动的值 intnumMoved= len - index - 1; //如果为0,则删除的是最后一个元素 if (numMoved == 0) //数组拷贝 setArray(Arrays.copyOf(elements, len - 1)); else { //新建数组 Object[] newElements = newObject[len - 1]; //将原数组中,索引index之前的所有数据,拷贝到新数组中 System.arraycopy(elements, 0, newElements, 0, index); //将元素组,索引index+1 之后的numMoved个元素,复制到新数组,索引index之后 System.arraycopy(elements, index + 1, newElements, index, numMoved); //替换原数组 setArray(newElements); } //返回老的值 return oldValue; } finally { //释放锁 lock.unlock(); } }