在程序执行的时候有可能遇到动态调度指令的问题,例如解决CPU的数据相关问题,就有可能将不相干的指令交换顺序,这在单线程没有问题,但是在多线程中就有可能出现问题。
例如:
x = y = 0;
thread1() thread2()
{ {
x = 1; y = 1;
r1 = y; r2 = x;
} }
有可能被CPU优化成:
thread1() thread2()
{ {
r1 = y; r2 = x;
x = 1; y = 1;
} }
若这两个线程并发执行就会造成r1 = r2 = 0的情况。
解决办法就是使用volatile关键字来阻止过度优化。
volatile关键字有两个功能:
1. 阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回。
2. 阻止编译器调整操作volatile变量的指令顺序。
但是这种做法只能阻止编译器调整顺序,对于CPU动态调换指令顺序就没有办法阻止了。