我是靠谱客的博主 美好黄豆,最近开发中收集的这篇文章主要介绍并发容器使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

CopyOnWriteArrayList、ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentHashMap等并发容器使用:

CopyOnWriteArrayList(写入时复制): 用于代替同步List(并发情况下安全),CopyOnWrite的实现。顾名思义,该类的原理是写入时先进行复制,然后在写入。所以添加操作时会占用多余的内存(用来复制),且阅读源码可知,该类加了ReentrantLock锁,所以并发情况下安全,但同时也降低了效率,并发读取时不会加锁,所以适用于迭代操作远远多于修改操作的情况。

public boolean add(T e) {
    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();
    }
}
final void setArray(Object[] a) {
    array = a;
}

原理:由上面的源码可知:该类添加操作 加了ReentrantLock锁,所以并发安全。添加时先复制旧的list,然后将新元素添加到新的list中,之后修改旧list的指向。读取不受限制,即读写分离。
优点:并发安全。
缺点
1.内存问题:添加操作时会复制旧list,当list占用内存很大时(例如200M、300M等),可能会造成频繁的Yong GC和Full GC。
2.数据一致性(及时性)问题:由于先复制再添加最后修改旧list的引用,所以CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。
3.效率问题:由于添加时加锁,所以同时添加多个或添加操作远大于修改时,不应该使用该容器。
ConcurrentSkipListMap、ConcurrentSkipListSet
和CopyOnWriteArrayList用于替代并发下的list一样,ConcurrentSkipListMap用于替代并发下的SortedMap,ConcurrentSkipListSet用于替代并发下的SortedSet。ConcurrentSkipListSet和ConcurrentSkipListMap的底部实现时跳跃链表。
ConcurrentHashMap
大多数情况下,ConcurrentHashMap可代替同步Map(并发安全),只有当应用程序需要加锁Map以进行独占访问时,才应该放弃ConcurrentHashMap。
原理:ConcurrentHashMap的数据结构(jdk1.8:数组+链表+红黑树,jdk1.7:数组+链表)。jdk1.7采用Segment分段锁机制实现并发,jdk1.8采用CAS+Synchronized来保证并发更新的安全。jdk1.8中的ConcurrentHashMap正在研究阶段,以后会更新这方面的内容,可以参考:https://blog.csdn.net/varyall/article/details/81277369。

最后

以上就是美好黄豆为你收集整理的并发容器使用的全部内容,希望文章能够帮你解决并发容器使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部