目录
目标
个人将concurrent包中的众多类分为加锁和不加锁两个分类,本文针对不加锁分类进行介绍。
JDK
JDK8
atomic
since1.5
AtomicBoolean/Integer/Long/Reference,value原子性更新
AtomicIntegerArray/LongArray/ReferenceArray,element value原子性更新
since1.8
多线程并发累积的解决方案
- 累积器
自定义累积方式,加减乘除或其他,Long/DoubleAccumulator
- 叠加器
叠加方式 Long/DoubleAdder
- Striped64
作为累积器叠加器的super
原理:使用cell[]存储每个线程累积结果。当需要获取当前结果时:cell[]遍历+累积操作
concurrentxxxx并发集合
实现都使用volatile+cas方式
ConcurrentLinkedQueue 可并发访问的FIFO队列,不保证size/遍历的实时准确性
ConcurrentLinkedDeque 可并发访问的双向队列,不保证size/遍历的实时准确性
ConcurrentSkipListMap 依据key和compare,构成Index tree,有序的Node list
ConcurrentSkipListMap
- 查找过程
在tree中,通过对比key的大小,定位key在list中的前任node(即node.key一定小于key);从node开始,向后进行key比较,获取命中的node。
- 数据结构图
- tree查找逻辑
while
if key > index.node.key
index.right
else
if index.down == null
return index.node
else
index.down
end while
ConcurrentSkipListSet
CountDownLatch
作为多个线程间流程同步协调器,保证n个线程一直等待,直到其他m个线程执行完某个流程。
count不可重置。
提供的行为:countDown(),await([timeout])
当线程调用await后,实际流程与Sync有关,概括为:for循环判断state是否为0 + park
由内部类(private static final class Sync extends AbstractQueuedSynchronizer)进行同步控制,使用AQS中的state标示count。