并发容器类

并发容器有:

    a. Java5.0中增加了ConcurrentHashMap(对应同步容器Hashtable)、CopyOnWriteArrayList(对应同步容器Vector)、CopyOnWriteArraySet(对应同步Set);

   b. Java6.0中增加了ConcurrentSkipListMap(对应同步容器的Collections.synchronizedMap(new TreeMap()))、ConcurrentSkipListSet(对应同步容器的Collections.synchronizedSet(new TreeSet()))

 

与同步容器相比,并发容器有以下优势:

    a.  提高了性能:Java5.0提供了多种并发容器类来改进同步容器的性能;

   b.  增加了并发性:并发容器是针对多个线程并发访问设计的;

    c.  将一些常见的并发操作实现为原子操作:在新的ConcurrentMap接口中对一些常见复合操作例如“若没有则添加”、“若相等则移除”和“若相等则替换”等,都已经实现为原子操作。

    1.  ConcurrentHashMap简介

        在Java6中,引入了ConcurrentSkipListMap和ConcurrentSkipListSet,分别作为同步的SortedMap和SortedSet的并发替代品(例如用synchrozideMap包装的TreeMap或TreeSet)。

        与HashMap一样,ConcurrentHashMap也是一个基于散列的Map,但它使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。Hashtable与Collections.synchronizedMap(new HashMap())同步机制是把整个表都锁住以提供独占访问,即在每个公有方法上都添加一个synchronized关键字,使得在同一时刻,只能有一个线程在访问这个表。而ConcurrentHashMap则使用粒度更细的分段锁来实现更大程度的共享。使用分段锁的好处是:

        a.  任意数量的读线程可以并发地访问Map;

        b.  执行读操作地线程和执行写操作地线程可以并发地访问Map;

        c.  一定数量地写线程可以并发地修改Map;

ConcurrentHashMap带来地结果是,在并发访问环境下将实现更高的吞吐量,而在单线程环境中只损失非常小的性能。只有当应用程序需要加锁Map以进行独占访问时,才应该放弃使用ConcurrentHashMap。

   2.  CopyOnWriteArrayList

        CopyOnWrite的字面意思是写时复制,也是一种读写分离的思想,读和写操作的是不同的容器。CopyOnWrite容器可以进行并发的读,而不需要加锁;当我们往容器中添加元素的时候,不直接往当前容器添加,而是先将当前容器复制出一个新的容器,然后往新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。注意:在读的时候不需要加锁,但在添加的时候,需要加锁,否则多个线程在添加元素的时候会复制N个副本出来。

    CopyOnWrite容器的应用场景是:读多写少;

    CopyOnWrite容器的缺点:

        a.  数据一致性问题:该类容器只能保证数据的最终一致性,不能保证数据的实时一致性。如果希望写入的数据,马上能读到,使用CopyOnWrite容器是不合适的;

        b.  内存占用问题:CopyOnWrite容器在执行写操作的时候,内存里会同时存在两个对象的内存,旧的对象和新复制的副本对象。如果这些对象占用的内存比较大,那么这个时候很有可能造成频繁的Yong GC和Full GC。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值