保证线程可见性
(1)MESI
(2)本质上使用CPU的缓存一致性协议
使用volatile,可以把value copy到工作线程中,首先是在主线程中对flag进行改变,然后改变堆内存的flag,通过CPU的缓存一致性,子线程也会知道flag值的改变
禁止指令重排序(CPU)
指令重排序
(1)DCL单例
(2)Double check lock
(3)Mgr06.java
//创建对象会经历以下步骤
1.在堆空间中,开辟一个区域,存放Test对象
2.给成员变量a赋默认值8
3.将这个堆空间地址传递给test对象(栈中)
以上三个步骤,就叫指令;使用volatile禁止了指令的重排序,保证指令顺序执行
Clas Test{
int a = 8;
public static void main(String[] args){
Test test = new Test();
}
}