Java高并发知识
Java高并发核心知识体系
一、核心基础:从根源理解并发问题
并发编程的核心目标是保证线程安全,而所有线程安全问题都源于三个根源性问题。
核心问题 | 问题描述 | 生动比喻 | 解决方案 |
---|---|---|---|
可见性 | 线程A修改了共享变量,线程B看不到这个最新值。 | 公告栏贴通知:第一个人改了内容,但后来的人还看着旧的抄本。 | volatile 、synchronized 、Lock |
原子性 | 一个或多个操作执行时被中途打断,导致操作不完整。 | 银行转账:A给B转100,扣了A的钱,但还没加给B时系统卡住,钱丢了。 | synchronized 、Lock 、原子类 |
有序性 | 程序执行顺序与代码顺序不一致,因编译器和CPU的指令重排序优化。 | 泡茶流程:本来是烧水→洗杯子→放茶叶,结果被优化成洗杯子→烧水→放茶叶。 | volatile 、synchronized |
底层基石:JMM(Java内存模型)
JMM是一个抽象规范,它定义了线程和主内存之间的交互关系,屏蔽了底层CPU缓存差异,并通过 Happens-Before规则 来解决上述三大问题。
二、并发编程“武器库”
1. 锁机制:控制共享资源访问
哲学之争:悲观锁 vs 乐观锁
维度 | 悲观锁 | 乐观锁 |
---|---|---|
思想 | 认为冲突总会发生,先拿锁再操作。 | 认为冲突很少发生,先操作再校验。 |