Java内存模型是什么?
JMM (java memory model)Java内存模型站在程序要的角度可以理解为一种规范,规范了JVM如何按需提供禁用缓存和指令优化的方法 具体包括以下:
- volatile
- synchronized
- finnal
- 6项happen-before规则
happen-before规则是什么?
前一个操作的结果对后续操作是可见,并不是指先后顺序
程序的顺序规则
在单线程中,前一个操作happen-before于它后续的所有操作
volatile
对一个volatile变量的写操作happen-before于对他的读操作
传递性
A happen-before 于B, B happen-before 于C,则 A happen-before 于C,
如下图:
public class VolatileDemo {
private int value;
private volatile boolean falg=false;
public void write(){
value=42;
falg=true;
}
public void reader(){
if(falg==true){
//System.out.println("falg:"+falg);
System.out.println("value:"+value);
}
}
public static void main(String[] args) throws InterruptedException {
VolatileDemo vd=new VolatileDemo();
new Thread(()->{
vd.write();
},"t1").start();
new Thread(()->{
vd.reader();
},"t2").start();
}
}

synchronized
对一个锁的解锁happen-before于后续对这个锁的加锁。
可以这么理解,假设X变量的初始值是10,线程A执行代码块之后,对X进行了写操作,x=12,执行完之后自动释放锁,线程B进入代码块开始执行,线程B可以看到线程A对变量X的操作,即变量值为12.
start()规则
线程A启动线程B,线程B可以看到线程A调用B.star()之前所有的操作 eg :

join()规则
主线程A等待子线程B完成,主线程A可以看到子线程B对共享变量的所有操作。
eg:
