CopyOnWriteArrayList底层原理
CopyOnWriteArrayList底层原理
CopyOnWriteArrayList是java并发包中的一个非常有用的类,它的特点是线程安全,且在并发环境下读操作无锁,并发读性能很好。那么它是怎么做到的呢?
基本原理
CopyOnWriteArrayList底层使用的是数组来存储元素的。在进行元素的修改操作时,它并没有在原有的数组上进行操作,而是先将当前的数组进行一次复制,然后在新的数组上进行修改,最后再将新的数组赋值给原数组。这就是为什么它叫CopyOnWriteArrayList。
代码实现如下:
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
elements = Arrays.copyOf(elements, len + 1);
elements[len] = e;
setArray(elements);
return true;
} finally {
lock.unlock();
}
}
可以看到,在添加元素时,首先获取了锁,然后复制数组,添加元素,最后再替换原数组。
使用方式
public class CopyOnWriteArrayListTest {
public static void main(String[] args) {
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);
}
}
运行代码,输出:[1, 2, 3]
性能分析
由于每次修改操作都会进行数组复制,所以在元素数量较多时,性能会下降。但由于读操作无需加锁,所以在读多写少的场合,性能优于其他线程安全的List,比如Vector。
适用场景
CopyOnWriteArrayList适用于读多写少的并发场景。比如,实时消息推送,CopyOnWriteArrayList可以用于保存连接的WebSocket Session。
总结
CopyOnWriteArrayList通过复制数组的方式,实现了写操作的线程安全和读操作的无锁并发,适用于读多写少的并发场景。
正文到此结束
相关文章
热门推荐
评论插件初始化中...