首页 > 编程语言 > 详细

volatile与重排序

时间:2020-04-07 01:54:58      阅读:103      评论:0      收藏:0      [点我收藏+]

  使用关键字volatile可以禁止代码的重排序;

  在Java程序运行时,JIT(即使编译器)可以动态地改变程序代码运行地顺序;例如,有如下代码:

A代码-重耗时
B代码-轻耗时
C代码-重耗时
D代码-轻耗时

  

  在多线程环境下,JIT有可能进行代码重排序,重排序后地代码顺序有可能如下:

B代码-轻耗时
D代码-轻耗时
A代码-重耗时
C代码-重耗时

  这样做地主要原因是CPU流水线是同时执行这4个指令的,那么轻耗时的代码在很大程度上先执行完成,以让出CPU流水线给其他指令,所以代码重排序是为了追求更高的程序运行的效率;

 

  重排序发生在没有依赖关系时,例如,对于上面的A,B,C,D代码,B,C,D代码不依赖A代码的结果,C,D代码不依赖A,B代码的结果,D代码不依赖A,B,C代码的结果,这种情况下就会发生重排序,如果代码之间有依赖关系,则代码不会重排序;

 

  使用关键字volatile可以禁止代码重排序,例如,有如下代码:

A变量的操作
B变量的操作
volatile Z变量的操作
C变量的操作
D变量的操作

  

  那么会有4种情况发生:

  1. A,B可以重排序
  2. C,D可以重排
  3. A,B不可以重排到Z的后面
  4. C,D不可以重排到Z的前面

  

  换言之,变量Z是一个屏障,Z变量之前或之后不可以跨越Z变量,这就是屏障的作用,关键字synchronized具有同样的特性;

 

 

  

 

volatile与重排序

原文:https://www.cnblogs.com/coder-zyc/p/12650493.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!