苦逼菜狗程序猿,用来总结和备忘,大家勿喷。
JDK里的COW容器有两种
•CopyOnWriteArrayList
•CopyOnWriteArraySet
基本用法
add(E e) 添加元素
get(int index) 获取元素
Copy-On-Write容器总结
添加元素的时候,不是直接往当前容器添加,是复制一个新的容器,往新的容器里面添加。添加完之后把原容器的引用指向新的容器。
因为是复制添加,添加元素不会添加到当前容器,所以我们可以对CopyOnWrite容器进行并发的读。不用加锁.
写是加锁的,写的源代码是用ReetrantLock加锁
也是一种读写分离的思想,读和写在不同的容器
在容量不大,读多写少的情况下适合使用(因为写会加锁并且会复制一份新的容器)
Copy-On-Write容器总结核心源码
add源码如下:
public boolean add(E e) {
//ReentrantLock s锁
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();
}
}
通过volatile关键字来共享数组
/** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;