并发Queue一

ConcurrentMap接口有如下两个重要的实现
  ConcurrentHashMap 内部使用段来表示这些不同的部分,每一个段就是一个小的hashTable,每一个段有自己的锁
        整体分成16个段,最高支持16个线程并发修改,这种方式是减小锁的粒度从而降低竞争的一种方案

 ConcurrentSkipListMap (支持并发排序,弥补了ConcurrentHashMap)

使用的话和HashMap差不多。


  Copy-On_Write (COW)是一种程序中的优化策略
  COW有两种容器:CopyOnWriteArrayList和CopyOnWriteSet
  CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,
      然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,
      因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
       (通俗讲就是复制一个副本,修改在副本上修改,删除,添加,等副本修改好了 ,直接把原来的引用指向副本(副本也就是成为原来的主本),这种就不存在锁的竞争这类的问题了)
                  注意:这种方式在读多写少的时候用,如果写多的话拷贝副本的成本是非常昂贵好资源的,不一定起到高效的作用
   
   
          并发Queue,jdk提供了两套实现: 1.ConcurrentLinkedQueue,非阻塞算法(代表了高性能队列,试用于高并发的场景下,通过无锁的方式,他的性能要好于BlockingQueue)。
                                ConcurrentLinkedQueue两个重要的方法
                                add()和offer()都是加入元素
                                poll和peek()都是取出,区分在前一个是取出后删除,后一个不会
              2.BlockingQueue  阻塞算法,实现类如下
                ArrayBlockingQueue,其构造函数必须带一个int参数来指明其大小
      LinkedBlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的大小由Integer.MAX_VALUE来决定
      PriorityBlockingQueue,其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序
   

你可能感兴趣的:(并发编程)