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

java.util.concurrent包下集合类的特点与适用场景的更多相关文章

  1. Java中java.util.concurrent包下的4中线程池代码示例

    先来看下ThreadPool的类结构 其中红色框住的是常用的接口和类(图片来自:https://blog.csdn.net/panweiwei1994/article/details/78617117 ...

  2. java.util.concurrent包下并发锁的特点与适用场景

    序号 类 备注 核心代码 适用场景 1 synchronized 同步锁 并发锁加在方法级别上,如果是单例class对象,则只能允许一个线程进入public synchronized void doX ...

  3. Java并发编程之java.util.concurrent包下常见类的使用

    一,Condition 一个场景,两个线程数数,同时启动两个线程,线程A数1.2.3,然后线程B数4.5.6,最后线程A数7.8.9,程序结束,这涉及到线程之间的通信. public class Co ...

  4. 线程并发线程安全介绍及java.util.concurrent包下类介绍

    线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start(); ...

  5. java.util.concurrent包

    在JavaSE5中,JUC(java.util.concurrent)包出现了 在java.util.concurrent包及其子包中,有了很多好玩的新东西: 1.执行器的概念和线程池的实现.Exec ...

  6. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

  7. 《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分

    这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int ...

  8. 【并发编程】【JDK源码】JDK的(J.U.C)java.util.concurrent包结构

    本文从JDK源码包中截取出concurrent包的所有类,对该包整体结构进行一个概述. 在JDK1.5之前,Java中要进行并发编程时,通常需要由程序员独立完成代码实现.当然也有一些开源的框架提供了这 ...

  9. 高并发编程基础(java.util.concurrent包常见类基础)

    JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法 ...

随机推荐

  1. c++利用类进行单链表的插入,删除,清空操作

    #if 1 #include <iostream> #include <stdlib.h> #include <time.h> #include <fstre ...

  2. 合肥工业大学oj p1012

    #include <iostream> #include <cstring> #define maxn 5 + 2 using namespace std; int m, n, ...

  3. linux下jvm优化、tomcat调优

    系统环境:jdk1.8,apache-tomcat-8.5.35 一.jvm优化 进入 bin/catalina.sh,修改JAVA_OPTS配置: JAVA_OPTS="-server - ...

  4. Python学习第七课

    Python学习第七课 'Alex' "Alex"print('hello'*5) #重复输出字符串 print('hellowold'[2:]) #类似于切片操作:会取出 llo ...

  5. Linux中使用sed命令替换字符串小结

    sed替换的基本语法为: sed 's/原字符串/替换字符串/' 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义,但是单引号”‘”是没有办法用反斜线”\”转义的 ...

  6. vim 加密(crypt)文本文档

    算法 vim7.3版本支持两种加密方式——PKzip算法(已知有缺陷的).Blowfish算法(从7.3版本开始支持).Blowfish2算法(从7.4.399版本开始支持)而vim -x 默认采用P ...

  7. 关于atom无限意外退出的一个原因

    atom很好用,也有开发直接使用这个工具进行编码,我经常使用,最近突然会报意外退出的错误. 再重启应用依然会报这个错,然后重启电脑后可以正常使用. 非常疑惑. 原来,是因为Shadowsocks开启的 ...

  8. 学习笔记:spark Streaming的入门

    spark Streaming的入门 1.概述 spark streaming 是spark core api的一个扩展,可实现实时数据的可扩展,高吞吐量,容错流处理. 从上图可以看出,数据可以有很多 ...

  9. Mesh内存分配器的mmap小技巧

    最近看了一篇内存分配器的论文,原理很简单,但是里面的数学论证还没看懂,这次先简单写一下原理和用到的API. 内存分配器是用于封装操作系统提供的底层API,给应用程序提供动态内存的.内存不断申请释放后, ...

  10. Python3.7 练习题(-) 如何使用Python生成200个优惠卷(激活码)

    # 如何使用Python生成200个优惠卷(激活码) import random import string # string.ascii_letters 26个大小写 # -9数字 # 获得激活码中 ...