copyonwritearraylist的底层原理是怎样的
时间: 2024-03-07 13:47:30 浏览: 72
CopyOnWriteArrayList的底层原理是在写入操作时,先将原数组复制一份,在新的数组上进行修改,最后再将原数组引用指向新数组,从而保证在写入操作时不影响读取操作。
具体的实现过程如下:
1. 在写入操作时,先使用ReentrantLock对整个数组进行加锁,然后将原数组复制一份。
2. 在新的数组上进行修改操作,修改完成后将原数组引用指向新数组。
3. 释放锁。
由于在写入操作时需要复制一份原数组,所以写入操作的效率相对较低,但是读取操作不需要加锁,因此读取操作的效率相对较高。
下面是CopyOnWriteArrayList部分源码,可以看出它的写入操作是通过创建一个新数组来完成的:
```java
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();
}
}
```
其中,getArray()方法用于获取当前数组,setArray()方法用于设置新数组。在写入操作时,先获取当前数组,然后将其复制一份,在新的数组上进行修改,最后通过setArray()方法将原数组引用指向新数组。在这个过程中,整个数组被加锁,保证线程安全。
阅读全文