volatile禁止指令重排
JMM要求有序性
计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一把分为以下3种
单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致....(单线程不用关心指令重排)
处理器在进行重新排序是必须要考虑指令之间的数据依赖性
多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测
源码写的顺序不见得和编译的指令顺序一样...如果编译器对这段代码进行执行重排优化后,可能出现下列情况:
线程1 线程2
b=1; a=2;
x=a; y=b;
结果: x=2 y=1
这也就说明在多线程环境下,由于编译器优化重排的存在,两个线程使用的变量能否保持一致是无法确定的...例子3
两个线程分别执行method1 和method2
多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测
假设线程1首先执行method1...所以指令重排会造成值不一致,所以有时候我们需要 volatile禁止指令指令重排
总结(了解)
PS:学习笔记,资源:尚硅谷,周阳
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。