Java内存模型(JMM)定义了主内存与工作内存间的交互,通过read、load、use、assign、store、write等原子操作保证变量访问的一致性,并确保原子性、可见性、有序性;其中volatile保证可见性与有序性,synchronized和锁机制支持happens-before原则,确保线程安全;垃圾回收运行在堆(主内存)上,依赖JMM保证对象引用状态一致,避免误回收或泄漏;final字段的正确初始化也由happens-before规则保障,体现JMM与对象生命周期协同。

Java内存模型(Java Memory Model, JMM)和垃圾回收机制是理解Java并发编程与性能调优的关键基础。它们共同决定了程序在多线程环境下的可见性、有序性和内存管理方式。
Java内存模型核心概念
主内存与工作内存:JMM定义了所有变量都存储在主内存中,而每个线程有自己的工作内存。线程对变量的操作(读、写)都发生在工作内存中,不能直接操作主内存。线程之间的通信必须通过主内存进行。
这种设计带来了性能提升,但也引入了可见性问题——一个线程修改了变量,另一个线程可能看不到最新值。
内存间的交互操作:JMM定义了一组原子操作来控制主内存与工作内存之间的数据传递:
立即学习“Java免费学习笔记(深入)”;
- read:把变量从主内存读取到工作内存
- load:把read得到的值放入工作内存的变量副本
- use:把工作内存中的值传递给执行引擎
- assign:把执行引擎接收到的值赋给工作内存中的变量
- store:把工作内存中的变量值传送到主内存
- write:把store传送来的值写入主内存的变量
这些操作需满足一系列规则,确保数据一致性。比如,不允许load或store单独出现,必须成对使用。
三大特性:原子性、可见性、有序性
原子性:基本数据类型的读写通常是原子的(long和double除外,在某些JVM上可能非原子)。synchronized块可以保证更大范围的原子操作。
可见性:一个线程修改了共享变量,其他线程能立即看到变化。volatile关键字能实现这一点,它强制变量在修改后立即写回主内存,并使其他线程的工作内存中该变量失效。
有序性:程序执行顺序可能被编译器或处理器重排序优化。JMM通过happens-before原则来保证某些操作的顺序性。例如:
- 同一个线程内的操作按代码顺序发生
- volatile变量的写操作先于后续对该变量的读操作
- unlock操作先于后续对同一锁的lock操作
垃圾回收与内存模型的关系
垃圾回收(GC)运行在JVM堆内存上,而堆是主内存的一部分。虽然GC不直接影响JMM的规范,但它会影响对象生命周期和内存可见性。
当一个对象不再被任何线程可达时,GC会回收其占用的内存。这要求JMM确保所有线程对对象引用的状态达成一致,否则可能出现提前回收或内存泄漏。
final字段的正确初始化依赖于happens-before规则,防止其他线程看到未完全构造的对象。这也是JMM与对象生命周期协同工作的体现。
基本上就这些。理解JMM不是为了背诵术语,而是为了解释为什么多线程程序会出现奇怪的问题,以及如何用volatile、synchronized、final等关键字写出正确的并发代码。不复杂但容易忽略。










