一、引言:为什么需要三大特性?
在多线程环境中,多个线程共享内存,若不加控制,会出现以下问题:
- 原子性破坏:
i++操作被拆分为'读 - 改 - 写',导致结果错误; - 可见性缺失:线程 A 修改变量,线程 B 仍读取旧值;
- 有序性混乱:编译器/CPU 指令重排序导致逻辑错乱(如 DCL 单例失效)。
Java 内存模型(JMM)通过 原子性(Atomicity)、可见性(Visibility)、有序性(Ordering) 三大特性保障并发安全。
⚠️ 注意:'一致性'不是 Java 并发三大特性的标准术语,常见于数据库(ACID)或分布式系统(CAP)。
二、三大特性定义
| 特性 | 定义 | 核心问题 |
|---|---|---|
| 原子性 | 操作不可分割,要么全部执行成功,要么完全不执行 | 复合操作被线程交错打断 |
| 可见性 | 一个线程修改共享变量后,其他线程能立即看到最新值 | 工作内存与主内存不同步 |
| 有序性 | 程序执行顺序应符合代码编写顺序 | 编译器/CPU 指令重排序 |
三、原子性(Atomicity)
1. synchronized —— JVM 内置锁
✅ 代码示例
public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++; // 非原子操作,需同步保护
}
public static void main(String[] args) throws InterruptedException {
SynchronizedExample e = new ();
(() -> {
( ; i < ; i++) e.increment();
});
(() -> {
( ; i < ; i++) e.increment();
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println( + e.count);
}
}

