JUC之各种线程安全容器

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;
    }
发布了40 篇原创文章 · 获赞 0 · 访问量 633

猜你喜欢

转载自blog.csdn.net/weixin_42610002/article/details/104661408
今日推荐