指令重排
什么是指令重拍:你写的程序,计算机并不是按照你写的那样去执行的。
源代码 —>编译器优化的重排—>指令并行也可能会重排—>内存系统也会重排—>执行
int x = 1; //1
int y = 2; //2
x = x + 5; //3
y = x * x; //4
我们所期望的:1 2 3 4 执行, 2134 ,1324 也可以跑
但是 4123 是不可能跑的
处理器在进行指令重排的时候会考虑数据直接的依赖性!
可能造成的结果:a b x y 这四个值默认都是0;
线程A | 线程B |
---|---|
x = a | y = b |
b = 1 | a = 2 |
正常的结果:x = 0; y = 0;但是可能由于指令重拍,这个b = 1,可能会先上去执行。因为线程A这两个变量没有依赖性
线程A | 线程B |
---|---|
b = 1 | a = 2 |
x = a | y = b |
指令重拍导致的诡异结果:x = 2:y = 1;
volatile可以避免指令重拍:内存屏障,CPU指令
内存屏障的作用:
1.保证特定的操作的执行顺序!
2.可以保证某些变量的内存可见性(利用这些特性volatile实现了可见性)
volatile是可以保证可见性,不能保证原子性,由于内存屏障,可以保证避免指令重拍的现象产生