Java 并发编程
2023-05-20 20:00:22 0 举报
AI智能生成
Java 并发编程
作者其他创作
大纲/内容
理论基础
起源
核心矛盾
CPU、内存、I/O 三者速度差异
解决方案
计算机体系结构: 增加 CPU 缓存,弥补CPU与内存速差
操作系统:增加进程、线程,分时复用 CPU,弥补 CPU 与 I/O 速差
编译程序:优化指令执行次序,使得缓存能够得到更加合理地利用
应用程序:绿色线程、协程
新的问题
可见性
原子性
顺序性
动机
解决并发编程问题
简化并发编程
理论(模型)
底层支持:Java 内存模型
(提供按需禁用缓存与编译优化的方法)
(提供按需禁用缓存与编译优化的方法)
关键字
final:不可变
volatile:禁用CPU缓存
synchronized:通过加锁保护临界区的线程访问互斥性
Happens-Before规则:约束编译器优化
高层抽象
信号量:Semaphore
锁:Lock
条件变量:Condition
并发编程
(互斥、同步)
(互斥、同步)
管程(MESA模型):Synchronize
方法论
面向对象编程
封装共享变量
final 关键字
理清共享变量之间的约束关系
制定并发访问策略
不变模式
Actor
CSP
Function 模式
避免共享
Thread Local Storage
管程及其他同步工具
考量点
安全性
数据竞争(Data Race)
竞态条件(Race Condition)
活跃性
死锁
活锁
饥饿
性能
阿姆达尔(Amdahl)定律
面向场景优化
无锁数据结构、算法
无锁数据结构
原子类
无锁的内存队列:Disruptor
无锁算法
本地存储 (Thread Local Storage, TLS)
写入时复制 (Copy-on-Write)
乐观锁
减少锁持有时间
细粒度锁:ConcurrentHashMap
分段锁:
SDK
并发基础工具
Lock & Condition(高级管程)
Lock
动机
解决 Synchronized 死锁问题
丰富管程使用场景
读多写少
可重入
升级 VS 降级
公平 VS 非公平
悲观 VS 乐观
原理
解决死锁问题
破坏不可抢占条件
响应中断
破坏持有并等待条件
非阻塞地获取锁
支持超时
面向场景
可重入
升级 VS 降级
公平 VS 非公平
分类
读多写少:ReadWriteLock
可重入:ReentrantReadWriteLock
公平 VS 非公平
公平:FairSync
非公平:NonfairSync
乐观锁:StampedLock
最佳实践
1. 永远只在更新对象的成员变量时加锁
2. 永远只在访问可变的成员变量时加锁
3. 永远不在调用其他对象的方法时加锁
Condition
动机
扩展 Synchronized,支持多个条件变量
原理
最佳实践
Semaphore
CountDownLatch & CyclicBarrier
数据结构
原子类
动机:扩大 volatile 使用场景
原理
CAS
分类
基本数据类型
AtomicBoolean
AtomicInteger
AtomicLong
数组
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
对象引用类型
AtomicReference
AtomicStampedReference
AtomicMarkableReference
对象属性更新器
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicReferenceFieldUpdater
累加器
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder
同步容器
并发容器
动机:优化同步容器
原理
锁分段
Copy-on-Write
弱一致性
分类
List:CopyOnWriteArrayList
Map
Key无序:ConcurrentHashMap
Key有序:ConcurrentSkipListMap
Set
CopyOnWriteArraySet
ConcurrentSkipListSet
Queue
单端阻塞
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue:不持有队列
LinkedTransferQueue
PriorityBlockingQueue
DelayQueue
单端非阻塞
ConcurrentLinkedQueue
双端阻塞
LinkedBlockingDeque
双端非阻塞
ConcurrentLinkedDeque
线程
Thread
工具类
Executor
动机:线程是一个重量级(内核级)的对象,应避免重复创建
原理:“生产者-消费者”模型
最佳实践
给线程指定业务语义:threadFactory
给handler选用合适的拒绝策略
CallerRunsPolicy:提交任务的线程自己去执行该任务
AbortPolicy:默认的拒绝策略,会 throws RejectedExecutionException
DiscardPolicy:直接丢弃任务,没有任何异常抛出
DiscardOldestPolicy:丢弃最老的任务,然后添加新的任务
Future
动机:感知任务执行状态,获取任务执行结果
分类
接口:Future
工具类:FutureTask
CompletionService
动机:简化批量异步化任务管理
原理:Executor + BlockingQueue + Future
CompletableFuture
动机:描述任务之间的依赖关系,简化Function编程
原理:Future + CompletionStage
CompletionStage 分类
串行
thenRun
thenAccept
thenApply
thenCompose
并行
汇聚
AND
thenCombine
thenAcceptBoth
runAfterBoth
OR
applyToEither
acceptEither
runAfterEither
设计模式
0 条评论
下一页