- 为什么会发生指令重排:计算机内存操作速度远慢于CPU运行速度所以就带来的CPU空置的问题,虚拟机会按照自己的一些规则会跳过执行慢的代码,去执行快的代码,从而提升jvm的整体性能。
- 加锁并不能防止指令重排:典型的单例双重锁模型,就会发生空指针异常,这个可以证明这个结论。
- volatile关键字设计的三个特征是:线程可见、不具备原子性、禁止指令重排,volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。
- 变量依赖 :编译器将不会对存在数据依赖性的程序指令进行重排,这里的依赖性仅仅指单线程情况下的数据依赖性;多线程并发情况下,此规则将失效。
来源:oschina
链接:https://my.oschina.net/u/4124756/blog/3165255