zoukankan      html  css  js  c++  java
  • java.util.concurrent包下集合类的特点与适用场景

    java.util.concurrent包,此包下的集合都不允许添加null元素

    序号 接口 特性 适用场景
    1 Queue、Collection ArrayBlockingQueue 有界、阻塞、线程安全、FIFO 生产者、消费者场景比较合适,并且支持FIFO
    2 Queue LinkedTransferQueue 阻塞、线程安全、FIFO

    LinkedTransferQueue实现了一个重要的接口TransferQueue,该接口含有下面几个重要方法:
    1. transfer(E e):若当前存在一个正在等待获取的消费者线程,即立刻移交之;否则,会插入当前元素e到队列尾部,并且等待进入阻塞状态,到有消费者线程取走该元素。
    2. tryTransfer(E e):若当前存在一个正在等待获取的消费者线程(使用take()或者poll()函数),使用该方法会即刻转移/传输对象元素e;若不存在,则返回false,并且不进入队列。这是一个不阻塞的操作。
    3. tryTransfer(E e, long timeout, TimeUnit unit):若当前存在一个正在等待获取的消费者线程,会立即传输给它;否则将插入元素e到队列尾部,并且等待被消费者线程获取消费掉;若在指定的时间内元素e无法被消费者线程获取,则返回false,同时该元素被移除。
    4. hasWaitingConsumer():判断是否存在消费者线程。
    5. getWaitingConsumerCount():获取所有等待获取元素的消费线程数量。

    3 Queue PriorityBlockingQueue 阻塞、优先级 要使用FIFO,您需要插入一个新的FIFOEntry(anEntry),而不是普通的entry对象
    4 Queue SynchronousQueue 阻塞、FIFO、线程安全、同步队列 只允许一个值添加、取出,无容量
    5 Queue ConcurrentLinkedQueue 线程安全、FIFO 线程安全,但一边遍历一边poll还是不行的
    6 Deque ConcurrentLinkedDeque 线程安全、链表 链表式操作,可对队首队尾直接操作
    7 Map ConcurrentHashMap 非阻塞、线程安全  
    8 Map ConcurrentSkipListMap 线程安全 构造函数支持排序,甚至可按照复合类型字段排序
    9 Map ConcurrentSkipListSet 线程安全

    构造函数支持排序,甚至可按照复合类型字段排序

    10 List CopyOnWriteArrayList 线程安全

    1、读写分离,读和写分开,需要读和写时都是对拷贝的副本进行操作。 
    2、最终一致性 
    缺点:
    1、由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致young gc或者full gc
    2、不能用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个set操作后,读取到数据可能还是旧的,虽然CopyOnWriteArrayList 能做到最终一致性,但是还是没法满足实时性要求;
    3、CopyOnWriteArrayList 合适读多写少的场景,不过这类慎用 
    因为谁也没法保证CopyOnWriteArrayList 到底要放置多少数据,万一数据稍微有点多,每次add/set都要重新复制数组,这个代价实在太高昂了。在高性能的互联网应用中,这种操作分分钟引起故障。
    参考网址:https://blog.csdn.net/linsongbin1/article/details/54581787

    11 Set CopyOnWriteArraySet 线程安全 1、读写分离,读和写分开,需要读和写时都是对拷贝的副本进行操作。 
    2、不存储重复对象
    3、最终一致性
    12 Queue DelayQueue 阻塞、线程安全、FIFO 某对象在getDelay方法返回0或者负数时,才能从take方法中获取到值,否则一直阻塞
    13 Queue LinkedBlockingQueue 有界、阻塞、线程安全、FIFO、链表  
    14 Deque LinkedBlockingDeque 有界、阻塞、线程安全、FIFO、链表  

      

    Queue和Deque的区别

    Deque不仅具有FIFO的Queue实现,也有FILO的实现,也就是不仅可以实现队列,也可以实现一个堆栈。LinkedBlockingQueue和LinkedBlockingDeque的区别能比较好地体现Queue和Deque接口的区别。

    参考网址:https://blog.csdn.net/vernonzheng/article/details/8267541  

    ArrayBlockingQueue和LinkedBlockingQueue的区别
    1. 队列中锁的实现不同
      ArrayBlockingQueue实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁;
      LinkedBlockingQueue实现的队列中的锁是分离的,即生产用的是putLock,消费是takeLock
    2. 在生产或消费时操作不同
      ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的;
      LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为Node<E>进行插入或移除,会影响性能
    3. 队列大小初始化方式不同
      ArrayBlockingQueue实现的队列中必须指定队列的大小;
      LinkedBlockingQueue实现的队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE

    参考网址:https://blog.csdn.net/ustc_zn/article/details/54864244 

  • 相关阅读:
    配置secureCRT
    LINUX的网口绑定(bond)
    背包形动态规划 fjutoj2375 金明的预算方案
    背包形动态规划 fjutoj1380 Piggy-Bank
    背包形动态规划 fjutoj2347 采药
    树形动态规划 fjutoj-2392 聚会的快乐
    树形动态规划 fjutoj-2131 第四集,聚集城市
    andriod开发--使用Http的Get和Post方式与网络交互通信
    线段树复合标记
    图论之拓扑排序 poj 2367 Genealogical tree
  • 原文地址:https://www.cnblogs.com/zhuwenjoyce/p/9578382.html
Copyright © 2011-2022 走看看