概述
1.是JDK1.5提供的应对高并发的基础包
2.主要包含:BlockingQueue,ConcurrentMap,ExecutorService,Lock,原子性操作
BlockingQueue-阻塞式队列
本质是队列,满足队列的原则(先进先出FIFO)。
所有的阻塞式队列都是有界的-当队列定义好之后,大小就不可变。
阻塞:当队列已满的时候,再试图放入的线程会被阻塞。当队列为空的时候,再试图拿支的线程会被阻塞。
要求队列中的元素必须非空
方法
抛出异常 | 返回值 | 阻塞 | 定时阻塞 | |
添加 | add | offer-true/false | put | offer |
获取 | remove | poll-null | take | poll |
ArrayBlockingQueue-阻塞式顺序队列
底层是基于数组进行存储
使用的时候需要指定容量,定义好后容量不可变
LinkedBlockingQueue-并发队列
底层是基于节点实现的
在使用的时候可以不指定容量。如果指定了容量,指定多大就是多大。如果不指定容量,默认容量是Integer.MAX_VALUE=>2的31次方-1.因为在实际生产环境中,一般不会向一个队列中添加21亿个值,所以一般会认为这个队列如果不指定容量就是无界的。
PriorityBlockingQueue-具有优先级的阻塞式队列
在使用的时候可以指定容量,也可以不指定。如果不指定容量,默认容量是11.(DEFAULT_INITIAL_CAPACITY = 11)
在拿取元素的时候,会对元素进行排序(自然排序-自然排序如果不指定一般是升序)。
要求元素所对应的类必须实现Comparable接口,重写compareTo方
如果使用迭代遍历的方式,则此时排序规则无效。
SynchronousQueue-同步队列
使用的时候不需要指定容量,默认容量为1
BlockingDeque-阻塞式双向队列
允许两端添加或者获取元素
继承了BlockingQueue
ConcurrentMap-并发映射
本质上是一个Map,存储的元素依然是键值对结构
保证映射的并发能力以及线程安全的能力。
ConcurrentHashMap-并发哈希映射
底层是数组+链表结构来存储数据。
默认初始容量是16,默认加载因子是0.75,扩容的时候,默认每次增加一倍。
采用了分段(分桶)锁机制。在后续版本中,ConcurrentHashMap为了提高效率,在分段锁的基础上,引入了读写锁机制。
a.读锁:允许多个线程读,不允许线程写。
b.写锁:只允许一个线程写。不允许线程读。
在JDK1.8中,引入了CAS(Compare And Swap-比较和交换)无锁算法。保证线程安全性。
CAS:我认为V的值应该是A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少。(V:内存值,A:旧的预期值,B:新的预期值。CAS过程只要被打断,那么就会从头重新比较)。
从JDK1.8开始,如果一个桶中的元素个数超过了8个的时候,这个桶中的链表会扭转成一棵红黑树;如果不足8个,那么红黑树扭转回链表。
a.红黑树:红黑树本质上是一棵自平衡二叉查找树。
b.二叉查找树:左子树都小于根,右子