Java内存模型
Java多线程内存模型
java多线程内存模型跟cpu缓存模型类似,是基于cpu缓存模型建立的,java线程内存模型是标准化的,屏蔽掉了底层计算机的区别

public class practice {
public static boolean flag=false;
public static void main(String[] args) {
new Thread(()->{
System.out.println("11111111111");
while (!flag){
}
System.out.println("22222222222222");
}).start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->change()).start();
}
public static void change(){
System.out.println("33333333333333");
flag=true;
System.out.println("4444444444444444");
}
}

注意这里可以看到结果并没有输出2222222 也就是说在线程一里flag还是false,说明线程一里的工作内存有自己的副本,线程2修改副本里的flag,线程一感受不到
那怎么能让多线程感受到呢?
加入 volatile关键字
volatile关键字


这里我们发现加入关键字后就可以输出222222
但面试不会简单的考你用法,我们来深入研究一下这个关键字
我们发现当flag变为true时他会先写到主内存中,再由总线嗅探机制感应到改变,从此线程一拿到的就是改变后的值了


1497

被折叠的 条评论
为什么被折叠?



