CopyOnWriteArrayList:写 _

📅 2026/7/1 8:11:26
CopyOnWriteArrayList:写 _
底层原理CopyOnWriteArrayList的动态数组机制 -- 它内部有个volatile数组(array)来保持数据。在“添加/删除”数据时都会新建一个数组并将更新后的数据拷贝到新建的数组中最后再将该数组赋值给volatile数组。这就是它叫做CopyOnWriteArrayList的原因每一个CopyOnWriteArrayList都和一个监视器锁lock绑定通过lock实现了对CopyOnWriteArrayList的互斥添加/删除。类的继承关系CopyOnWriteArrayList实现了List接口List接口定义了对列表的基本操作同时实现了RandomAccess接口表示可以随机访问(数组具有随机访问的特性)同时实现了Cloneable接口表示可克隆同时也实现了Serializable接口表示可被序列化。javapublic class CopyOnWriteArrayListE implements ListE, RandomAccess, Cloneable, java.io.Serializable {}类的内部类COWIterator类COWIterator表示迭代器其也有一个Object类型的数组作为CopyOnWriteArrayList数组的快照这种快照风格的迭代器方法在创建迭代器时使用了对当时数组状态的引用。此数组在迭代器的生存期内不会更改因此不可能发生冲突并且迭代器保证不会抛出 ConcurrentModificationException。创建迭代器以后迭代器就不会反映列表的添加、移除或者更改。在迭代器上进行的元素更改操作(remove、set 和 add)不受支持。这些方法将抛出 UnsupportedOperationException。javastatic final class COWIteratorE implements ListIteratorE { /** Snapshot of the array */ // 快照 private final Object[] snapshot; /** Index of element to be returned by subsequent call to next. */ // 游标 private int cursor; // 构造函数 private COWIterator(Object[] elements, int initialCursor) { cursor initialCursor; snapshot elements; } // 是否还有下一项 public boolean hasNext() { return cursor snapshot.length; } // 是否有上一项 public boolean hasPrevious() { return cursor 0; } // next项 SuppressWarnings(unchecked) public E next() { if (! hasNext()) // 不存在下一项抛出异常 throw new NoSuchElementException(); // 返回下一项 return (E) snapshot[cursor]; } SuppressWarnings(unchecked) public E previous() { if (! hasPrevious()) throw new NoSuchElementException(); return (E) snapshot[--cursor]; } // 下一项索引 public int nextIndex() { return cursor; } // 上一项索引 public int previousIndex() { return cursor-1; } /** * Not supported. Always throws UnsupportedOperationException. * throws UnsupportedOperationException always; {code remove} * is not supported by this iterator. */ // 不支持remove操作 public void remove() { throw new UnsupportedOperationException(); } /** * Not supported. Always throws UnsupportedOperationException. * throws UnsupportedOperationException always; {code set} * is not supported by this iterator. */ // 不支持set操作 public void set(E e) { throw new UnsupportedOperationException(); } /** * Not supported. Always throws UnsupportedOperationException. * throws UnsupportedOperationException always; {code add} * is not supported by this iterator. */ // 不支持add操作 public void add(E e) { throw new UnsupportedOperationException(); } Override public void forEachRemaining(Consumer? super E action) { Objects.requireNonNull(action); Object[] elements snapshot; final int size elements.length; for (int i cursor; i size; i) { SuppressWarnings(unchecked) E e (E) elements[i]; action.accept(e); } cursor size; } }类的属性属性中有一个可重入锁用来保证线程安全访问还有一个Object类型的数组用来存放具体的元素。当然也使用到了反射机制和CAS来保证原子性的修改lock域。javapublic class CopyOnWriteArrayListE implements ListE, RandomAccess, Cloneable, java.io.Serializable { // 版本序列号 private static final long serialVersionUID 8673264195747942595L; // 可重入锁 final transient ReentrantLock lock new ReentrantLock(); // 对象数组用于存放元素 private transient volatile Object[] array; // 反射机制 private static final sun.misc.Unsafe UNSAFE; // lock域的内存偏移量 private static final long lockOffset; static { try { UNSAFE sun.misc.Unsafe.getUnsafe(); Class? k CopyOnWriteArrayList.class; lockOffset UNSAFE.objectFieldOffset (k.getDeclaredField(lock)); } catch (Exception e) { throw new Error(e); }