CopyOnWrite系列、Concurrent系列
大体结构
总体结构比较简单。
Concurrent系列
如果应用侧重于Map放入与获取的速度,而不在意顺序的话ConcurrentHashMap很好,反之ConcurrentSkipListMap 更适合,如果我们对大量数据做频繁的修改,ConcurrentSkipListMap 也可能表现出优势。
SkipList图示:
为什么没有针对TreeMap的并发容器呢?
因为TreeMap要实现高效的线程安全是非常困难的,它的实现是基于复杂的红黑树。为保证效率,当进行插入或删除操作时,会移动节点进行平衡操作,这导致在并发场景中难以进行合理粒度的同步。而SkipList结构要相对简单很多,通过层次结构提高访问速度,虽然空间空间复杂度:O(nlogn)还有待提高,但是在增删元素时维持线程安全的开销要好的多。
CopyOnWrite系列
首先 CopyOnWrite的意思是,任何add,set,remove操作都会拷贝原数组,修改后替换原来的数组,通过这种防御性的方式,实现另类的线程安全。
关于两个CopyOnWrite容器,其实CopyOnWriteArraySet底层是通过包装了CopyOnWriteArrayList来实现的。
下面是一段add的源码
public boolean add(E e) {
synchronized (lock) {
Object[] elements = getArray();
int len = elements.length;
//拷贝
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
//替换
setArray(newElements);
return true;
}
}
final void setArray(Object[] a) {
array = a;
}