【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
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(); } }
这个是cow list的add的代码, 其中getArray返回的是全局的数组 是有volatile 修饰的
private transient volatile Object[] array;
既然有 volatile 修饰保证了可见性还有必要 增加一步复制操作吗, 还是说复制只是为了扩容
数组不可变的,扩容就是一个length+1新数组,然后把以前数组的内容copy过去,最后把需要add的元素加在新数组最后一个节点,返回新数组
数组不Copy,怎么复制数据?