使用场景

适用于读操作远远多于写操作的场景。也是线程安全的一个并发容器。 CopyOnWriteArrayList就是读操作不加锁,只有写操作加锁,而且写操作也不会阻塞读操作,只有写写才会阻塞。


实现原理

CopyOnWriteArrayList的所有可变操作(add,set)并不是在原有的数组上进行修改,而是通过创建底层数组的副本,然后将新元素插入到副本中,然后在用副本将原来的数组替换掉。这样就可以保证写操作不会阻塞到读取操作了。


CopyOnWriteArrayList读取操作

读取操作是不加锁的,原因就是底层数组不会发生修改,只会被另一个数组进行替换,所以可以保证数据安全。


CopyOnWriteArrayList的写操作

写操作是加锁的,保证了同步,防止了多个线程同时Copy出来多个数组副本。


源码解析参考