主题切换
JMM相关
一、JMM核心定义
JMM(Java Memory Model)即Java内存模型,是一套规范,专门约束多线程操作共享变量的读写行为,通过统一内存读写规则,解决并发下可见性、有序性、原子性问题,屏蔽底层硬件CPU缓存差异。
二、两大内存分区
- 主内存 所有线程共享的内存区域,存放类成员变量、静态变量、共享实例变量,是共享变量的唯一真实存储位置。
- 工作内存 每个线程私有独立内存,线程之间完全隔离;存储共享变量的副本,线程所有读写操作只能操作自身工作内存,不能直接读写主内存。
三、线程与主内存数据交互流程
- 线程读取共享变量:从主内存load加载副本到自身工作内存;
- 线程修改变量:仅修改工作内存内的副本;
- 同步回主内存:通过save指令将工作内存最新值写回主内存;
- 线程之间无法直接访问对方工作内存数据,必须通过主内存中转。
四、核心特点
- 线程工作内存相互隔离,私有数据不存在线程安全问题;
- 多线程并发修改主内存共享变量,会出现数据不一致(可见性问题);
- JMM规定load、save指令强制同步,volatile、synchronized、Lock等关键字依靠JMM规则保证数据同步。
五、面试高频问题解析
问:什么是JMM?
答: JMM是Java内存模型,是一套多线程共享变量读写规范,用来统一并发内存操作行为,屏蔽不同CPU缓存架构差异,保障并发程序内存读写正确性。它将内存划分为所有线程共享的主内存,以及每个线程独有的工作内存。
问:主内存和工作内存是什么关系?
答: 主内存存放原始共享变量;每个线程拥有独立工作内存,存储共享变量副本。线程不能直接读写主内存,必须先load到工作内存,修改后save回主内存;线程之间不能互相访问对方工作内存,数据交互只能经过主内存。
问:为什么多线程会出现数据不可见?
答: 线程修改变量只更新自身工作内存副本,没有立刻同步到主内存;其他线程读取的还是旧的主内存数据,无法感知修改,造成可见性问题。
问:JMM和JVM运行时数据区是一回事吗?
答: 不是。JMM是并发内存访问逻辑规范,抽象概念;JVM运行时数据区是虚拟机内存物理分区(堆、栈、方法区等),二者概念维度完全不同。