1、Java内存模型

image.png

2、可见性

问题

image.png—->image.png

分析

image.png
image.png
image.png

解决

image.png给run变量加上修饰符volatile
image.png

volatile英译是不稳定的、异变的,加上此修饰符相当于告诉JVM这个变量时异变的。 虽然效率上有损失,但是保证共享变量再多线程上的可见性。


image.pngsynchronized可以保证可见性(重量级锁效率低)

可见性和原子性

可见性并不保证原子性
image.png
image.png

两阶段终止设计模式

image.png—->image.png
不需要考虑打断和打断标记的问题
犹豫模式:https://www.bilibili.com/video/BV16J411h7Rd?p=139&spm_id_from=pageDriver

3、有序性(指令重排)

原理

image.png
image.png
image.png—->可优化为image.png
指令重排的前提是,重排指令不能影响结果
image.png

指令重排带来的问题

image.png因为指令重排会造成多个结果的问题

image.png

解决

image.png给ready变量加上volatile修饰符

4、volatile

image.png

volatile对于可见性的保证

读屏障
image.png
读屏障

image.png

image.png

volatile对于有序性的保证

image.png
image.png

对于有序性的补充: image.png

image.png

小结

image.png

happens-before规则

image.png

image.png

image.png

image.png

image.png

image.png

image.png