系列:多线程(四)J.U.C简介
文章目录
构成
1. volatile和CAS
volatile:JVM和操作系统支持
- 可见
- 内存屏障:禁止重排
CAS:操作系统支持
- 乐观锁的一种实现
2. AQS
实现基础:
- state标志位
- 模板方法模式:根据共享/互斥选择重写对应方法
- 同步队列CLH:节点的状态
3. 原子类
- 原子更新基本类:boolean、int、long
- 原子更新数组:int array、long array、reference array
- 原子更新引用:reference、reference field、mark
- 原子更新字段类:int field、long field、stamp field
- 新增:
- DoubleAccumulator
- LongAccmulator
- DoubleAdder
- LongAdder
CAS存在ABA问题,Java提供AtomicStampedReference类(版本)避免该问题
4. Lock
特性:
-
公平,非公平锁
-
独享,共享锁
-
可重入锁
ReentrantLock
互斥锁
支持:
-
可重入
-
公平,非公平(默认)
锁中断
ReadWriteLock
读写锁。共享读,互斥写
支持:
-
可重入
-
公平,非公平(默认)
锁中断
锁降级
5. 同步器
CountDownLatch
允许一个线程或多个线程等待(await),直到其他线程中执行的一组操作完成(countDown)
CyclicBarries
允许一组线程全部等待(await)彼此到达共同屏障点
CountDownLatch是一次性的,CyclicBarries可循环使用
Semaphore
信号量。一个计数信号量,取到许可的通行,取不到的阻塞(acquire),执行完释放许可(release)
…
6. 阻塞队列
写:队列慢,阻塞等待
读:队列空,阻塞等待
有界队列:ArrayBlockingQueue
可选有界:LinkedListBlockingQueue, LinkedListBlockingDeque
无界队列:PriorityBlockingQueue, DelayQueue, LinkedTransferQueue, LinkedBlockingDeque
SynchronousQueue:不存储元素
可选有界队列,指定了容量就是有界,否则就是无界
7. 线程池 & Executors
线程池的处理流程:
https://blog.csdn.net/qq_31854267/article/details/104009118
https://blog.csdn.net/qq_31854267/article/details/104017479
key
- ThreadFactory
- 任务队列:有界用的多,避免OOM,但是可能会丢失任务
- 饱和策略
8. 并发容器
ConcurrentHashMap:7采用分段锁,8采用CAS
ConcurrentLinkedQueue:非阻塞链表,采用CAS
ConcurrentSkipListMap和ConcurrentSkipListSet:跳表
CopyOnWriteArrayList和CopyOnWriteArraySet:写复制
9. Fork/Join
并行执行任务的框架
特点:
- 任务分隔
- 工作窃取
- 任务结果合并
参考
《Java多线程编程核心技术》
《Java并发编程的艺术》