每个线程在修改变量值的时候优先修改的是自己工作内存中的共享变量副本,经典的验证程序:
这个程序中如果要保证修改立马生效的话就需要对于变量initFlag加上volitiel的关键字(保证可见性)
JMM原子操作
加volitile之前的整体流程(对应于上面的那段代码),write的实际是方法结束前
加了volitile就会有lock这个关键字,如果没有volitile就没有
a=0,x=1 b=1, y=1(one先执行) 或者 a=1,x=1 b=0, y=1(other先执行),不应该出现a=1且b=1的情况,但是实际是会出现的:
阿里巴巴开发者手册里关于DCL单例的描述:
对象的初始化过程:
指令重排和内存屏障
lock修饰的代码前后左右不能重排序