Volatile关键字
Volatile关键词的第一个特性:易变性。
所谓的易变性,在汇编层面反映出来,就是两条语句,下一条语句不会直接使用上一条语句中volatile变量的寄存器内容,而是重新从内存中读取。
Volatile关键词的第二个特性:不可优化性。
volatile告诉编译器,不要对我这个变量进行各种激进的优化,甚至将变量直接消除,保证程序员写在代码中的指令,一定会被执行。
Volatile关键词的第三个特性:顺序性。
Volatile变量间的操作,不会被编译器打乱。
Volatile变量与non-Volatile变量之间的相对顺序,是可能被编译器打乱的。
哪怕将所有的变量全部都声明为volatile,就算杜绝了编译器的乱序优化;
但是针对生成的汇编代码,CPU仍有可能会乱序执行,导致程序依赖的逻辑出错,volatile对此无能为力;
void thread1() {
// do something
togo = true;
}
void thread2() {
while (!togo)
;
// do something
}
针对这个多线程的应用,真正正确的做法,是构建一个happens-before语义。