Java 多线程核心:线程安全机制与单例模式实现
一、线程安全问题
1. 造成线程安全的五大原因
在并发场景下,线程安全主要受以下五个因素影响:
- 操作系统的随机调度(根本原因)
- 两个线程同时修改同一个变量
- 修改变量操作不是原子的
- 内存可见性问题
- 指令重排序问题
前两点属于环境因素,难以直接控制。通常我们重点从第 3 点入手,通过锁机制确保操作的原子性。
2. synchronized 的特性
synchronized 的本质是通过引入锁竞争,确保同一时刻只有一个线程能执行临界区代码,从而保证读 - 改 - 写三步操作的原子性。
① 互斥性
同一时刻,只能有一个线程持有这把锁。
流程示意:线程 A 获得锁 → 线程 B 阻塞等待 → 线程 A 释放锁 → 线程 B 获得锁
public class Demo13 {
private static int sum;
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 50000; i++) {
// 只对 sum 加了锁,外部循环仍可并发
synchronized (lock) {
// CPU 层面是三步操作,加锁确保原子性
sum++;
}
}
});
Thread (() -> {
( ; i < ; i++) {
(lock) {
sum++;
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(sum);
}
}



