线程工作内存与主内存的同步时机(刷回 + 加载)
要理解线程工作内存与主内存的同步时机,核心基于Java内存模型(JMM) ——JMM抽象了线程私有工作内存和所有线程共享的主内存,规定了变量操作的内存语义,同步时机主要与volatile关键字、锁操作、线程生命周期节点强相关,以下分两类场景详细说明(所有时机均为JMM强制要求,保证多线程间的可见性)。
一、工作内存刷写到主内存的时机(线程修改的变量同步到共享内存)
当线程对变量执行写操作后,以下场景会强制将工作内存中该变量的最新值刷写到主内存,同时让其他线程工作内存中该变量的副本失效(保证后续读操作能获取最新值):
- 写volatile修饰的变量时
这是volatile的核心内存语义——JMM强制要求,写volatile变量的操作必须立即刷主存,且会插入store-store内存屏障,阻止写操作重排序,保证volatile变量的修改对其他线程立即可见。 - 释放锁(unlock)时
包括synchronized代码块/方法执行结束(隐式释放锁)、java.util.concurrent.locks.Lock接口调用unlock()方法(显式释放锁)。JMM规定:锁释放前,线程在临界区对变量的所有修改必须刷写到主内存,且锁的释放-获取满足happens-before规则(释放锁的操作先行于后续获取同一把锁的操作)。 - 线程正常/异常终止前
线程执行完run()方法正常退出,或因抛出未捕获异常、调用stop()(不推荐)等原因异常终止时,JMM会强制将该线程工作内存中所有未刷主存的变量修改刷写到主内存,避免线程终止导致修改丢失。 - final字段初始化完成后
当对象的final字段初始化完成(构造方法执行结束,且对象引用未逸出构造方法),JMM会强制将final字段的初始值刷写到主内存。保证其他线程获取到该对象引用时,能看到final字段的正确值(final字段一旦初始化完成,不可被修改,刷主存后永久可见)。
二、主内存加载到工作内存的时机(线程从共享内存获取变量最新值)
当线程对变量执行读操作前,以下场景会强制线程从主内存加载该变量的最新值到工作内存,覆盖工作内存中可能存在的旧值(失效副本),保证线程读到的是共享内存的最新数据:
- 读volatile修饰的变量时
与volatile写操作对应——JMM强制要求,读volatile变量的操作必须先从主内存刷新最新值,执行前会先失效工作内存中该变量的副本,再插入load-load内存屏障,阻止读操作重排序,保证每次读volatile变量都是主内存的最新值。 - 获取锁(lock)时
包括进入synchronized代码块/方法(隐式获取锁)、Lock接口调用lock()方法(显式获取锁)。JMM规定:锁获取前,线程会清空工作内存中与临界区相关的变量副本,强制从主内存加载这些变量的最新值到工作内存,保证线程在临界区中读到的是其他线程释放锁时刷入主存的最新数据。 - 线程启动(Thread.start())后
调用子线程的start()方法后,子线程开始执行run()方法前,JMM会强制子线程从主内存加载父线程在调用start()前所有已刷入主存的变量修改。基于happens-before规则:父线程调用start()的操作先行于子线程的所有操作,保证子线程能看到父线程启动前的所有有效修改。 - 首次访问未加载的变量/对象初始化时
线程首次访问某个变量(未在工作内存中创建副本),或初始化新对象时访问其成员变量,会强制从主内存加载变量的初始值(基本类型默认值/引用类型null)或最新值到工作内存,创建私有副本后再进行操作。
核心同步时机总结(易记对应关系)
| 操作类型 | 刷主内存时机 | 加载工作内存时机 |
|---|---|---|
| volatile关键字 | 写volatile变量 | 读volatile变量 |
| 锁操作 | 释放锁(unlock) | 获取锁(lock) |
| 线程生命周期 | 线程正常/异常终止前 | 线程启动(start())后 |
| 特殊字段 | final字段初始化完成后 | - |
| 首次访问 | - | 首次访问未加载的变量 |
关键补充
- 普通变量(未被volatile修饰、未在锁临界区中)的读写,JMM不保证即时的刷主存或加载操作——线程可能长时间持有工作内存的旧值,这也是普通变量多线程可见性问题的根源;
- 以上所有时机均为JMM层面的强制规则,与底层物理内存(CPU缓存、主存)的同步机制无关(JVM会通过内存屏障、缓存一致性协议等底层手段实现JMM的语义);
- 并发包中的工具类(如
AtomicInteger、ConcurrentHashMap),其底层通过Unsafe类的CAS操作+volatile,间接遵循上述同步时机,保证可见性和原子性。

浙公网安备 33010602011771号