java并发容器

<1>CopyOnWriteArrayList:并发

写时复制的容器。通俗的理解是当咱们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,对象

复制出一个新的容器,而后新的容器里添加元素,添加完元素以后,再将原容器的引用指向新的容器。这样作的好处是咱们内存

能够对CopyOnWrite容器进行并发的读,而不须要加锁,由于当前容器不会添加任何元素。因此CopyOnWrite容器也是get

一种读写分离的思想,读和写不一样的容器。hash

使用CopyOnWriteMap须要注意两件事情:it

1. 减小扩容开销。根据实际须要,初始化CopyOnWriteMap的大小,避免写时CopyOnWriteMap扩容的开销。容器

2. 使用批量添加。由于每次添加,容器每次都会进行复制,因此减小添加次数,能够减小容器的复制次数。List

缺点:引用

 内存占用问题。由于CopyOnWrite的写时复制机制,因此在进行写操做的时候,内存里会同时驻扎两个对象的内存,旧的对象方法

  和新写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会建立新对象添加到新容器里,而旧容器的对象还

  在使用,因此有两份对象内存)。若是这些对象占用的内存比较大,好比说200M左右,那么再写入100M数据进去,内存就会占

  用300M,那么这个时候颇有可能形成频繁的Yong GC和Full GC。以前咱们系统中使用了一个服务因为每晚使用CopyOnWrite

  机制更新大对象,形成了每晚15秒的Full GC,应用响应时间也随之变长。针对内存占用问题,能够经过压缩容器中的元素的方法

  来减小大对象的内存消耗,

 数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。因此若是你但愿写入的的数据,

   立刻能读到,请不要使用CopyOnWrite容器。

<2>ConcurrentHashMap

    它引入了一个“分段锁”的概念,

    在ConcurrentHashMap中,就是把Map分红了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪一个Segment中:

相关文章
相关标签/搜索