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