java.util.concurrent
包
CopyOnWriteArrayList
ArrayList -> CopyOnWriteArrayList
在package java.util.concurrent;
J.U.C
适合读多写少,数据不大的
写的时候copy一份来写,写完指向新的那个,写是加锁的,一次只能一个在写
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);//copy
newElements[len] = e;//写
setArray(newElements);//指向新数组
return true;
} finally {
lock.unlock();//释放
}
}
读数据就是普通get 没锁,很快
public E get(int index) {
return get(getArray(), index);
}
缺点
- 如果数据较多 内存消耗大
- 不能马上读到新数据
设计思想
- 读写分离
- 最终一致性
- 另外开辟空间解决并冲突
HashSet,TreeSet -> CopyOnWriteArraySet,ConcurrentSkipListSet
HashMap‘ TreeMap -> ConcurrentHashMap,ConcurrentSkipListMap