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通过复制数组的方式,实现了写操作的线程安全和读操作的无锁并发,适用于读多写少的并发场景。

正文到此结束
评论插件初始化中...
Loading...