J.U.C-volatile
禁止指令重排
把 instance = new Instance() 分为三步 分配内存, 初始化对象、对象指向内存地址
第二步发生指令重排3在2前执行
问题所在
![](https://img2018.cnblogs.com/blog/720263/201901/720263-20190124215143558-1683807697.png)
保证可见性( 一个线程对volatile变量的修改,能够立刻被其他线程所见)
有一个全局的状态变量
open: boolean open=true; 这个变量用来描述对一个资源的打开关闭状态,true表示打开,false表示关闭,
假设有一个线程A,在执行一些操作后将open修改为false:
//线程A
resource.close();
open = false;
线程B随时关注open的状态,当open为true的时候通过访问资源来进行一些操作:
//线程B
while(open) {
doSomethingWithResource(resource);
}
当A把资源关闭的时候,open变量对线程B是不可见的,如果此时open变量的改动尚未同步到线程B的工作内存中,
那么线程B就会用一个已经关闭了的资源去做一些操作,因此产生错误。