ConcurrentHashMap - 线程安全哈希map
线程安全的HashMap,相比HashSet一个synchronized锁全表,ConcurrentHashMap效率更高,jdk7及以前的版本是分成一个个segment实现的,jdk8及以后使用Node+CAS+synchronized
put的核心思想:
如果数组tab不存在,使用unsafe提供的同步能力初始化数组
如果对应哈希位没有元素,使用CAS操作插入
如果有哈希冲突,使用sychronized锁表
具体代码可以参考ConcurrentHashMap部分
ConcurrentLinkedQueue - 线程安全无界队列
非阻塞无边界队列,它的性能是所有队列里面最高的,因为它并未使用阻塞或等待/通知机制实现。也没有使用任何锁。因此它的方案是无限自旋+CAS操作。
具体代码见ConcurrentLinkedQueue部分
阻塞队列
阻塞指的是队满时阻塞插入线程,队空时阻塞移除方法,阻塞队列有几种通用的方法:
插入:add(抛出异常),offer(返回特殊值且提供超时能力),put(一直阻塞)
移除:remove(抛出异常),poll(返回特殊值及超时能力),take(一直阻塞)
检查:element、peek
阻塞队列类型:
ArrayBlockingQueue:数组构成的有界阻塞队列
LinkedBlockingQueue:链表构成的有界阻塞队列
PriorityBlockingQueue:支持优先级排序的无界阻塞队列
DelayQueue:使用优先级队列实现的无界阻塞队列
SynchronousQueue:一个不存储元素的阻塞队列
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列
ArrayBlockingQueue - 数组有界阻塞队列
ArrayBlockingQueue的特性包括:
数组+FIFO排序
使用ReentrantLock,默认非公平
代码详见ArrayBlockingQueue部分
LinkedBlockingQueue - 链表有界阻塞队列
特性包括:
使用链表实现,FIFO排序
默认最大长度是Integer.MAX_VALUE
代码见LinkedBlockingQueue部分
PriorityBlockingQueue - 优先级阻塞队列
特性:
底层为数组实现,无解阻塞队列
默认情况下元素按自然顺序排序,或自定义comapreTo()方法指定元素排序规则或初始化
DelayQueue - 阻塞无界延迟队列
特性:
在非阻塞优先级队列PriorityQueue的基础上增加了阻塞和延迟能力,需要实现Delayed接口,只有延迟期满,才能从队列中提取元素获取元素
DelayQueue的使用场景:
内存缓存系统:缓存到期即可以获取到元素
定时任务调度:一旦从DelayQueue中获取到元素,即可以开始执行,衍生了TimerQueue
代码见DelayQueue部分
LinkedTransferQueue - 链式无界阻塞预占队列
特性:
具有独特的transfer方法和tryTransfer方法,用于将元素直接传递给正在等待的消费者
入队的元素都会封装成Node,其中具备一个isData属性,true代表封存的是元素,false代表封存的是等待的消费线程,如果存在封存的等待线程,则不入队,将元素直接传递给消费线程并激活
代码见LinkedTransferQueue部分
LinkedBlockingDeque - 链式阻塞双端队列
特性:
与LinkedBlockingQue类似,但是具备双向插入和移出元素的能力,从而使竞争减少一半
提供addFirst、addLast、offerFirst、offerLast、peekFirst、peekLast等方法
LinkedBlockingDeque用于工作窃取算法,可以使一个线程池被阻塞的时候,由其他空闲线程池辅助完成该线程池的工作任务
代码见LinkedBlockingDeque部分
评论区