Java 并发编程基础概念

一、并发的第一性原理(Why)

1. 并发问题的本质

并发问题 ≠ 多线程问题

并发问题产生的充分必要条件是:

多个执行主体 + 共享的可变状态 + 时间上的交错执行

只要满足以上三个条件之一被消除,并发问题就不会出现:


2. 并发失效的根源:观察不一致

并发错误的本质不是“写错代码”,而是:

一个线程基于已经失效的观察结果做出了决策

这会导致典型问题:


3. 并发必须满足的三大约束目标

所有并发控制手段,本质上都在解决以下三个问题之一或多个:

约束目标根本问题核心含义
原子性操作被打断要么全做,要么不做
可见性观察失效状态修改对他人可见
有序性指令重排因果顺序不被破坏

👉 并发工具的差异,本质是它们解决这三类约束的能力不同。


二、线程安全的抽象模型(What)

1. 线程安全的本质定义

当多个线程并发访问某个对象时,无论执行顺序如何、是否发生交错,只要对象始终能维持其不变式(Invariant),则称该对象是线程安全的。

⚠️ 线程安全与“全局变量 / 静态变量”没有必然因果关系,真正的风险来源是:

共享 + 可变 + 未受控访问


2. 线程安全的经典分类(稳定认知模型)

分类抽象定义设计含义
绝对线程安全调用方无需任何同步内部完全自洽,代价最高
相对线程安全单次操作安全组合操作需外部协作
线程兼容自身不安全可通过调用方同步保证
线程对立无法安全并发使用设计上排斥并发

👉 这是并发设计的边界说明书,而不是实现技巧。


3. 不可变性:最强的并发策略

不可变对象天然线程安全

设计哲学:

这是所有并发控制中:

成本最低、收益最高、最稳定的方案


三、并发控制的设计哲学(How · Strategy)

1. 并发控制的三种核心策略

策略核心思想典型方式
互斥同一时间只允许一个执行者锁 / Monitor
乐观冲突是小概率事件CAS / 版本校验
隔离根本不共享状态不可变 / 线程封闭

👉 并发设计的第一选择顺序应是:

隔离 → 乐观 → 互斥


2. 悲观并发 vs 乐观并发(哲学差异)

👉 这是性能与确定性之间的取舍问题


3. 阻塞 vs 非阻塞算法

在非阻塞算法中,一个线程的失败或挂起不会导致其他线程的失败或挂起。

这是并发系统**可伸缩性(Scalability)**的关键。


四、并发机制模型(How · Mechanism)

1. Java 内存模型(JMM)

JMM 不是内存结构,而是:

关于“何时可见、何时有序、何时允许重排”的规则集合

核心目标:


2. Happens-Before:并发世界的因果律

Happens-Before 不是时间先后,而是:

结果可见性与因果保证

关键规则:


3. Monitor 模型(互斥的抽象基础)

Monitor 提供了:

这是 synchronized 的理论原型


4. CAS 与 CPU 原语

CAS(Compare-And-Swap)是:

由硬件直接支持的原子比较与更新指令

特点:


五、Java 并发工具的能力映射(How · Tool)

1. 并发能力 × Java 工具矩阵

并发能力抽象机制Java 实现
互斥Monitorsynchronized / Lock
可见性Happens-Beforevolatile
原子更新CASAtomicX
非阻塞无锁算法CAS + 自旋

2. synchronized 的设计定位

synchronized 不是“慢”,而是:

最安全、最完整、语义最强的并发原语

它同时提供:

锁升级(偏向 → 轻量 → 重量)体现的是:

JVM 对不同竞争强度的自适应优化


3. volatile 的设计定位

volatile 只解决:

不提供互斥

适用场景:


4. CAS 的设计定位

CAS 是:

以 CPU 指令换取锁阻塞的性能方案

适合:


六、并发设计的稳定选型原则(Guideline)

  1. **能不共享,就不共享**(隔离优先)
  2. **能不可变,就不可变**(设计优先)
  3. **能无锁,就无锁**(乐观优先)
  4. **必须互斥,才加锁**(兜底方案)
  5. **先保证正确性,再谈性能**

七、并发模型的演进:从线程到纤程

1. 传统线程模型的瓶颈


2. 协程 / 纤程的核心思想

新并发模型拆分为:

目标不是“更快”,而是:

用更低成本管理更大规模的并发

关联内容(自动生成)