java线程学习之并发容器

        同步容器类是都是串行化的,它们虽然实现了线程安全(里面的方法用synchronized修饰)(并不绝对,自行百度why),但是降低了并发性,在多线程应用程序中,严重降低了应用程序的吞吐量。

         ConcurrentMap是有两个重要实现ConcurrentHashMap,ConcurrentSkipListMap(它先实现了ConcurrentNavigableMap接口)。

             ConcurrentHashMap在JDK6 JDK7中的并发实现主要是通过“分段加锁”的思想。使用段(Segment)来表示不同的部分,每个段其实就是一个小的HashTable,他们有自己的锁,只要多个修改操作发生在不同的段上,他们就可以并发进行。把一个整体分成16个段,也就是最高支持16个线程的并发修改操作。这是多线程场景中减小所粒度,从而降低锁竞争的一种方案。

             ConcurrentHashMap在JDK8它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。它沿用了与它同时期的HashMap版本的思想,底层依然由“数组”+链表+红黑树的方式实现,但是为了做到并发,又增加了很多辅助的类,例如TreeBin,Traverser等对象内部类。

        

          Copy-On-Write简称COW,是程序设计中的一种优化策略。CopeOnWrite容器是写时复制的容器,通俗的理解使我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器Copy,复制出一个新的容器,然后新的容器里添加元素,添加元素之后,再将原容器的引用指向新的容器。这样做的好处可以对CopyOnWrite容器并发地读,而不需要加锁,因为当前容器不会添加任何元素,所以CopyOnWrite是采用读写分离的思想,是一种读写分离的容器。

          Copy-On-Write有两种容器,分别是CopyOnWriteArrayList和CopyOnWriteArraySet

              

         并发队列主要有两种实现 

             1.ConcurrentLinkedQueue为代表的高性能队列

             2.BlockingQueue接口为代表的阻塞队列

                  ConcurrentLinkedQueue是一个高并发场景下的队列,采用无锁的方式,实现了高并发场景下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。它是一个基于链接节点的无界安全队列。该队列的元素遵循先进先出的原则,头是最先加入的,尾是最近加入的,该队列不允许null元素。

                  重要方法:add()和offer()都是加入元素的方法。poll()和peek()都是取头元素的节点,区别在于前者会删除元素,后者不会。

             ArrayBlockingQueue基于数组的阻塞队列实现,在ArrayBlockingQueue数组内部,维护了一个定长数组,以便于缓存队列的数组对象,其内部没有实现读写分离,也就意味着生产和消费不能完全并行,长度是需要定义的,可以指定先进先出或者先进后出,也叫有界队列,在很多场合都非常适用。

            LinkedBlockingQueue是一个基于链表的阻塞队列,通ArrayBlockingQueue类似,其内部也维持着一个数据缓冲队列(该队列由一个链表 构成),LinkedBlockingQueue之所以高效的处理并发数据,是因为其内部实现采用分离锁(读写分离两个锁),从而实现生产者和消费者操作的完全并行。它是一个无界队列。

           SynchronousQueue:一种没有缓冲的队列。生产者生产的数据会直接被消费者直接获取并消费。

           PriorityBlockingQueue:基于优先级的阻塞队列,(优先级的判断根据构造函数传入的 Commpator对象来决定,也就是说传入的对象必须实现Comparable接口),在实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁,它是一个无界队列。

            DelayQueue带有延迟时间的Queue,其中的元素只有当延迟时间到了,才能从队列中获取该元素,DelayQueue的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存数据的进行移除,数据超时进行处理,空闲连接的处理的等等。

生于忧患,死于安乐
原文地址:https://www.cnblogs.com/songlove/p/10837513.html