jmm 体现在以下三个方面
- 原子性 保证指令不会受到上下文切换的影响
- 可见性 保证指令不会受到cpu缓存的影响
- 有序性 保证指令不会受并行优化的影响
一、可见性
不会停止的程序
public class Visibility {
static boolean mark = true;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
System.out.println("mark = "+mark);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
mark = false;
System.out.println("修改 mark = "+mark);
}).start();
while (mark){
//main线程会一直循环,知道mark被修改为false
}
System.out.println(Thread.currentThread().getName() + "mark 可见");
}
}
二、有序性
VM在不影响程序正确性的情况下可能会调整语句的执行顺序,该情况也称为 指令重排序
static int i;
static int j;
// 在某个线程内执行如下赋值操作
i = ...;
j = ...;
有可能将j先赋值
三、原子性
原子性大家应该比较熟悉,上述同步锁的synchronized代码块就是保证了原子性,就是一段代码是一个整体,原子性保证了线程安全,不会受到上下文切换的影响。