一、JMM
1、概念
JMM(Java Memory Model),Java内存模型
线程间的通信和同步(并发执行的活动实体),都由JMM来控制
Java线程间的通信,JMM决定了一个线程对共享变量的写入何时对另外一个线程可见
Java线程间的同步,程序中用于控制不同线程间操作发生相对顺序的机制
JMM主要结构包括:
- 主内存(共享内存),用于保存共享变量(堆中保存的:对象的实例和数组、方法区中保存的:静态变量)
- 本地内存(工作内存),每个线程执行时,所使用的内存区域,它保存了共享变量的副本
2、内存交互操作指令
JMM定义了8个操作指令:
-
read和load
read读取主内存中的数据,并传输给工作内存
load将read的变量值赋值给工作内存中的变量的副本
-
use和assign
use将工作内存中的变量,传递给执行引擎
assign将执行引擎对变量进行赋值
-
store和write
store将工作内存中的数据,传输给主内存
write将store传输过来的变量存储到主内存中
-
lock和unlock
lock将主内存中的变量标识为一个线程独占的状态
unlock对主内存中锁定的变量进行解锁
read load
主内存 ----> 工作内存 ----> 共享变量的副本
use assign
工作内存 ----> 执行引擎 ----> 共享变量的副本
write store
共享变量的副本 ----> 工作内存 ----> 主内存
lock/unlock
主内存 ----> 共享变量
3、内存可见性
【1】问题引出
private static int i = 0;
public static void main(String[] args) {
new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
System.out.println("数值被改变为:" + i)