Java 并发
2023-06-09 14:01:06 2 举报
AI智能生成
Java 并发
作者其他创作
大纲/内容
⭐ 基本概念和应用
并发编程
基本概念
竞态条件(Race Condition)
临界区(Critical Section)
并发级别
阻塞(Blocking)
无饥饿(Starvation-Free)
无障碍(Obstruction-Free)
无锁(Lock-Free)
无等待(Wait-Free)
核心问题
缓存导致的可见性问题
线程切换带来的原子性问题
编译优化带来的有序性问题
线程(Thread)
基本原理
线程实现
内核线程实现
用户线程实现
用户线程加轻量级进程实现
线程调度
协同式
抢占式
线程状态
初始(New)
Thread 类
Runnable 接口
✔ Callable 接口
可运行(Runnable)
准备(Ready):等待分配 CPU 资源
运行(Running):正在运行
休眠(Sleeping)
等待(Waiting):等待其他线程唤醒分配 CPU 时间片
定时等待(Time Waiting):定时自动唤醒分配 CPU 时间片
阻塞(Blocked):等待获取排它锁,其线程释放锁即结束此状态
终止(Terminated)
线程操作
线程中断
InterruptedException
interrupted()
Executor 的中断
Executor.shutdown()
future.cancel(true)
安全取消线程
检测 isInterrupted 处理中断
Future 限时运行
停止线程池
应用实例
BlockingQueue
ExecutorService
毒丸对象(Poison Pill)
使用关闭钩子正确关闭 JVM
使用守护线程
实现 UncaughtException 接口处理 RuntimeException
线程组
线程通信
等待 await - 通知 signal
与 sleep 的对比
notify 与 notifyAll
wait 的范式
共享变量同步
管道流
线程协作 join
死锁问题
产生原因
互斥
不可抢占
占有且等待
循环等待
问题排查
死锁预防
避免使用多个锁
严格设计锁获取顺序
使用超时/非阻塞方法
使用静态代码分析
饥饿问题
保证资源充足
公平地分配资源
避免持有锁的线程长时间执行
Java 内存模型(JMM)
CPU 缓存
内存交互操作
操作指令
read
load
use
assign
store
write
lock
unlock
变量拷贝规则
加锁规则
执行次序
三大特性
原子性(Atomicity)
可见性(Visibility)
内存屏障:volatile
同步:synchronized
不可变:final
有序性(Ordering)
先行发生规则(Happens Before)
操作顺序
程序次序规则:a -> b
传递性规则:a -> b -> c
锁和 Volatile
volatile 变量规则:写 -> 读
管程锁定规则:解 -> 加
线程相关
线程启动规则:start -> 其它
线程终止规则:其它 -> 终止
* 线程中断规则
对象生命周期
* 对象终结规则:init -> finalize
内存屏障(memory barrier)
读写屏障
指令优化原理
应用实例
作为线程协作条件
作为守卫变量
阻止指令重排序
管程(Monitor)
MESA 模型
互斥
同步
wait 的范式
notify 使用
AQS
基本原理
Sync 对象
acquire 方法
Node 对象
加锁 / 解锁
可重入
资源共享
Exclusive(独占)
Share(共享)
底层设计
CountDownLatch
Reentrantlock
扩展 AQS
acquire 方法
acquireQueued 方法
J.U.C 包
原子类型
基本类型
AtomicInteger
...
数组类型
AtomicIntegerArray
...
引用类型
AtomicReference
...
修改类型
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
LongAdder
......
使用须知
其他工具
CountDownLatch
CycliBarrier
Exchanger
Phaser
Semaphore
同步容器
组合操作
遍历操作
并发容器
Collection
Set
CopyOnWriteArraySet
ConcurrentSkipListSet
List
CopyOnWriteArrayList
Queue
单端阻塞
无界
LinkedTransferQueue
PriorityBlockingQueue
DelayQueue
有界
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
单端非阻塞
ConcurrentLinkedQueue
双端阻塞
LinkedBlockingDeque
双端非阻塞
ConcurrentLinkedDeque
Map
ConcurrentSkipListMap
ConcurrentHashMap
存储结构
计算长度
同步机制
JDK 1.7
get
put
size
JDK 1.8
put
初始化
size
I/O
IO 方式
BIO
磁盘操作
字节操作
文件复制
装饰者模式
字符操作
编码与解码
String 的编码方式
Reader 与 Writer
网络操作
InetAddress
URL
Sockets
Datagram
NIO
块:Block
字符集:Charset
通道:Channel
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
缓冲区:Buffer
读写过程
选择器:Selector
NIO 操作
文件操作
套接字操作
1. 创建选择器
2. 通道注册到选择器
3. 监听事件
4. 获取到达的事件
5. 事件循环
AIO
内存映射文件
IO 原理
同步和异步
阻塞和非阻塞
序列化
transient
序列化方式
Java 原生
Hessian
JSON
⭐ 线程互斥
加锁原则
只在更新对象的成员变量时加锁
只在访问可变的成员变量时加锁
不在调用其他对象的方法时加锁
Lock & Condition
基本使用
实现原理
可响应中断
支持超时
支持非阻塞
可重入性
扩展功能
条件变量
锁中断
公平锁/ 非公平锁
非阻塞插队
读写分离
......
应用实例
实现阻塞队列
Synchronized
基本使用
代码块
方法
类
底层原理
同步原理
锁对象
Monitor Record
ReadWriteLock
应用实例
实现缓存
锁的升降级
StampedLock
应用实例
乐观读
应用模板
注意事项
注意中断
成对申请释放
⭐ 线程协作
Semaphore
基本使用
应用实例
实现限流器
CountDownLatch
基本使用
应用实例
实现对账系统
多线程
线程池
CountDownLatch
CycliBarrier
基本使用
应用实例
改进对账系统
CyclicBarrier
使用细则
Phaser
Exchanger
⭐ 线程分工
Executor(线程池)
基本使用
优势
降低资源消耗
提高响应速度
更强大的功能
提高可管理性
线程池类型
无限线程:CachedThreadPool
固定线程:FixedThreadPool
顺序执行:SingleThreadExecutor
单线程调度:SingleThreadScheduledExecutor
多线程调度:ScheduledThreadPool
工作窃取:WorkStealingPool
底层原理
内部组成
工作队列
线程集合
线程工厂
Worker 线程
拒绝策略执行器
生命周期
任务调度
动态化线程池
简化线程池配置
实现方式
参数可动态修改
增加线程池监控
负载监控和告警
任务级精细化监控
运行时状态实时查看
使用细则
设置合适的线程数
计算密集型
I/O 密集型
避免同步死锁
高效管理工作线程
声明线程池后立即启动核心线程
空闲时自动回收核心线程
避免丢失数据
谨慎处理异常
谨慎使用拒绝策略
避免内存溢出/泄漏
不使用无界队列
不过度扩展
不使用 ThreadLocal
替代方案
连接池
连接数配置
连接可用性
Future
FutureTask
基本使用
CompletableFuture
基本使用
CompletionStage
串行关系
汇聚关系 AND
汇聚关系 OR
异常处理
使用细则
回调地狱(Callback Hell)
CompletionService
基本使用
Fork/ Join
基本使用
应用实例
MapReduce
⭐ 性能优化和并发设计
线程安全保障
同步
阻塞:悲观锁
Copy-on-Write
典型案例
同步工具
并发集合
锁优化
非阻塞:乐观锁
底层原理
局限性
过度的自旋
ABA
单个共享变量的原子操作
频繁冲突时性能较差
实际应用
原子类型
无同步
无状态与可重入代码
不可变(Immutable)
final 修饰的基本类型
字符串(String)
枚举(Emun)
Number 的部分子类
Collections.unmodifiableXxx 集合
享元模式
线程封闭
栈封闭
线程本地存储(ThreadLocal )
基本使用
应用实例
底层原理
继承性
使用须知
手动清理
避免与线程池共用
安全发布对象
常用发布模式
在静态块初始化
volatile 或 Atomic 的域
final 域
synchronized 块
安全发布对象容器
自定义类
实例封闭
装饰器模式
监视器模式
线程安全委托
把类封装为不可变
封装实现线程安全
识别约束条件
减少临界区范围
扩展功能
继承
装饰类
组合
并发设计模式
分工协作
Thread-Per-Message 模式
多线程
Fiber
Worker Thread 模式
线程池
线程死锁
生产者 - 消费者模式
批量执行任务
分阶段提交
避免共享
Immutability 模式
Copy-on-Write 模式
Thread Local 模式
多线程 IF
Guarded Suspension 模式
响应通知
Balking 模式
volatile
单次初始化
双重检查
优雅终止
两阶段终止模式
标记终止
终止线程池
毒丸对象
其他并发模型
Actor 模型
消息与方法
规范化定义
实现累加器
软件事务内存(STM)
基本原理
版本号包装类
读写操作类
事务接口
事务读写类
原子化操作类
应用实例
协程:轻量级线程
Golang 中的协程
协程同步
结构化并发编程
CSP 模型
实现累加器
生产者 - 消费者模式
与 Actor 模型的区别
应用实例
Guava RateLimiter
令牌桶算法
算法优化
容量 = 1
容量 > 1
Netty
传统线程模型
Reactor 模式
Netty 线程模型
Disruptor
基本使用
进阶应用
串/并行操作
多生产者多消费者模型
核心组件
RingBuffer
Sequencer
Sequence
Sequence Barrier
WaitStrategy
EventProcessor
WorkProcessor
局部性原理
伪共享
ArrayBlockingQueue
缓存行填充
无锁算法
HiKariCP
FastList
ConcurrentBag
添加连接到队列
获取空闲连接
释放连接
0 条评论
下一页