03.可见性、有序性与原子性问题

#并发

总结
  • 并发 Bug 三个根源:可见性(CPU 缓存不共享)、原子性(线程切换)、有序性(指令重排)
  • 安全性靠加锁,活跃性(死锁/活锁/饥饿)靠设计,性能靠细粒度锁和无锁算法
  • JMM 通过 volatile/synchronized/final 和 happens-before 规则按需禁用这些优化

并发 Bug 的三个根源,本质都是 CPU/编译器为了提升性能做的优化副作用。Java 通过 04.Java内存模型JMM 来按需禁用这些优化。

1. 三个问题

可见性:一个线程对共享变量的修改,另一个线程不能立刻看到。

原子性:一个或多个操作在 CPU 执行过程中不被中断。

有序性:程序不一定按代码顺序执行。

2. 安全性 / 活跃性 / 性能问题

问题类型 表现 解决方向
安全性 竞态条件,结果依赖线程执行顺序 加锁
活跃性 死锁、活锁、饥饿 死锁问题与解决方案
性能 锁粒度过大导致串行化 细粒度锁、无锁算法(CAS学习)、读写锁