并发之前四章关键点
并发1
并发编程的挑战
-
上下文切换
- 无锁编程
- cas算法
- 使用最少线程
- 协程
-
死锁
- 死锁产生的必要条件
- 互斥
- 请求与保持
- 不可剥夺
- 循环等待
- 死锁产生的必要条件
-
资源限制
重点的关键字
- volatile
- 保障了共享变量的可见性
- 会生成一个Lock前缀的指令
- 当前缓冲行写会主内存
- 令其他处理器的对应该地址的缓冲行失效
- 缓存一致性协议
- MESI协议
- synchronized
- 每个对象都可以作为锁
- 普通同步方法,锁的是当前实例对象
- 静态同步方法,锁的是当前类的Class对象
- 同步方法块,锁的是括号里的配置的对象
- 通过monitor进入和退出来实现锁的功能
- 四种锁
- 无锁
- 偏向锁
- 轻量级锁
- 重量级锁
- ⭐锁升级
- 阐述明白一个锁升级的流程
- 每个对象都可以作为锁
- CAS
- 循环cas实现原子操作
- 三个问题
- ABA问题
- 使用版本号
- 循环时间长开销大
- 只能保证一个共享变量的原子操作
- ABA问题
- 保证复杂内存操作原子性
- 总线锁
- 缓存锁
- AQS
Java内存模型
并发编程的两个关键问题
- 线程之间如何通信
- 线程之间如何同步
通信机制
- 共享内存
- 消息传递
Java的并发采用共享内存模型
重排序问题
- 目的:提供性能
- 编译器和处理器
- 编译器优化重排序
- 指令集并行的重排序
- 内存系统的重排序
内存屏障
volatile
特性
- 可见性
- 对一个volatile变量的对,总能看到对这个volatile变量最后的写入
- 原子性
- 对任意单个volatile变量的读/写是具有原子性的,但是复合操作不具备原子性
对应的内存语义有所认知
⭐单例模式
- 几种代码实现都要能实现
相关链接
https://blog.csdn.net/weixin_44577413/article/details/114183013
https://blog.csdn.net/weixin_44577413/article/details/114183797