并发
2025/9/22大约 5 分钟
并发
为啥要有并发
并发的目的就是让程序运行的更快
并发和并行

操作系统中任务调度算法
- 先来先服务
- 时间片轮转
- 短作业优先
- 优先级调度
- 最高响应比
- 多级反馈队列
并发编程的挑战
上下文切换
- 无锁编程
- cas算法
- 使用最少线程
- 协程
死锁
- 死锁产生的必要条件
- 互斥
- 请求与保持
- 不可剥夺
- 循环等待
- 死锁产生的必要条件
资源限制
死锁⭐
产生死锁的四个条件
- 资源是互斥的->左手持有你的左手腕的同时 右手获得左手腕失败
- 请求保持-> 左手在请求右手腕的同时保持着自己已经持有的右手腕
- 环路等待-> 成环 获得不到我就等
- 不可剥夺-> 已经被右手持有的右手腕不会被左手剥夺
如何避免死锁->如何处理死锁
破坏其中任意一个就行
- 互斥是不破坏的
- 银行家算法
- 资源一次性给够
- 不够的话 就不给你
- 哲学家进餐问题(扩展)
- 假如->有9个资源 已知一个线程需要3个资源才能满足其需要,在保证系统安全的前提下最多可以有多少个线程执行
volatile
- 保障了共享变量的可见性
- 会生成一个Lock前缀的指令
- 当前缓冲行写会主内存
- 令其他处理器的对应该地址的缓冲行失效
- 缓存一致性协议
- MESI协议
synchronized
每个对象都可以作为锁
- 普通同步方法,锁的是当前实例对象
- 静态同步方法,锁的是当前类的Class对象
- 同步方法块,锁的是括号里的配置的对象
通过monitor进入和退出来实现锁的功能

监视器进入和退出 有一个同步队列和一个等待队列
四种锁
- 无锁
- 偏向锁
- 轻量级锁
- 重量级锁
⭐锁升级
- 阐述明白一个锁升级的流程
CAS
- 循环cas实现原子操作
- 三个问题
- ABA问题
- 使用版本号
- 循环时间长开销大
- 只能保证一个共享变量的原子操作
- ABA问题
保证复杂内存操作原子性
- 总线锁
- 缓存锁
AQS
JMM
Java的并发采用共享内存模型

重排序问题
- 目的:提升性能
- 编译器和处理器
- 编译器优化重排序
- 指令集并行的重排序
- 内存系统的重排序
内存屏障
volatile
特性
- 可见性
- 对一个volatile变量的对,总能看到对这个volatile变量最后的写入
- 原子性
- 对任意单个volatile变量的读/写是具有原子性的,但是复合操作不具备原子性
对应的内存语义有所认知
⭐单例模式
- 几种代码实现都要能实现
线程进程和协程
进程
- 资源分配和调度的基本单位
- 进程间的通信
- 管道
- 命名管道
- 消息队列
- 共享内存
- 信号量
- 套接字
- 信号
线程
- 被系统调度的最基本单位
- 多个线程共享属于同一个进程的资源
- 线程间的通信
- 共享内存
- 消息传递
- 信号量
- 套接字
协程
- 一个线程内
- 调度有程序员控制
- 和方法不一样,执行过程中可以中断转向其他的协程,同样也可以再次跳回
- 执行效率比线程要高
- 不涉及到锁
⭐线程的状态
Java线程状态的变迁

中断
要求理解java中和操作系统中的中断(作为扩展)
等待通知机制
- Thread.join()
- 原理就是等待通知
⭐开发一个简易的tomcat服务器
Api级别的锁
lock接口
AQS
- 原理
- ReentrantLock
- 公平锁的实现
- 非公平锁的实现
- 可重入锁
- 自己这个线程可以在不释放锁的前提下获得多次这个锁
- ReentrantReadWriteLock
- Semaphore
- CountDownLatch
- CyclicBarrier
Condition 接口

支持是多个等待队列和一个同步队列
⭐⭐锁升级
偏向锁->轻量级->重量级
三个锁的对比
⭐CAS + volatile
本身重要
- ABA问题
- 版本号解决
- 循环时间比较大
- 只能保证一个共享变量的原子操作
⭐线程之间的通信
共享内存
消息传递
⭐进程间通信方式
信号量
*管道
- 无名管道
- 父子进程间
- 命名管道
- 无亲缘进程
- 无名管道
消息队列
*套接字
信号
共享存储
Daemon线程
如何启动一个线程
start 和 run的区别
⭐中断是啥
⭐等待通知范式
Thread.join()
⭐ThreadLocal
⭐⭐lock接口&&AQS原理
Aqs原理
实现lock接口的一些锁
什么是可重入锁
Condition
同步队列
等待队列
java的并发容器
⭐⭐ConcurrentHashMap
1.7
1.8 掌握
线程池
- 可以复用已经创建好的线程
- 线程的创建和销毁都是重量的操作 比较消耗性能
- 提升我们响应速度

⭐ 线程池的几个参数
原子操作类
- 原理是cas+volatile
合理使用线程池
- 降低资源消耗
- 提高响应速度
- 提高线程的可管理性
关键指标和核心参数
- 核心线程池
- 工作队列
- 线程池
- 饱和策略
已有的线程池
FixedThreadPool
SingleThreadExecutor
CachedThreadPool
FutureTask
- 基于AQS
