JAVA多线程技术学习笔记——volatile关键字解析
一、volatile关键字的作用
volatile关键字的作用主要有两个确保有序性禁止指令重排,确保可见性。简单的来说就是保护变量不被主函数和中断函数反复修改造成读写错误
1.禁止指令重排
a)什么是指令重排
我们知道,代码的执行顺序一般来说是从上之下,即拥有我们所称之为有序性。看下面一段代码:
int i = 0;
boolean flag = false;
i = 1; //语句1
flag = true; //语句2
通常语句1是在语句2前面的,但是JVM在真正是按照这样的顺序运行的吗?其实并不一定,因为JVM可能会对代码进行指令重排。所谓的指令重排就是由于处理器为了提高运行效率可能会在确保输出结果与代码按顺序执行的结果相同的前提下调整代码的运行顺序从而优化代码。语句1和语句2谁先执行对最终的程序结果并没有影响,那么就有可能在执行过程中,语句2先执行而语句1后执行。但是要注意,虽然处理器会对指进行重排序,但是它会保证程序最终结果会和代码顺序执行结果相同,那么它靠什么保证的呢?这里就要引入一个原则——happens-before原则,只要符合该原则的代码都不能调换顺序具有依赖性,不符合的代码就可能进行指令重排。