并发容器使用

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值