如何理解指令重排?

spider_boy 2017-08-24 12:31:46
Java并发环境下指令重排会带来很多问题,那到底什么是指令重排?
...全文
487 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
soton_dolphin 2017-08-24
  • 打赏
  • 举报
回复
就是说Java 编译器可能重新排列源代码执行的顺序来优化编译的表现,比如 int a = 0, int b = a + 1; int c = 2; 在编译成bytecode 以后,执行的顺序可能是 int c = 2; int b = a + 1; int a = 0;
天涯若风 2017-08-24
  • 打赏
  • 举报
回复
大概意思就是,同一个方法中,两个变量的定义前后,会影响程序最后的运行结果。 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读一个变量之后,再写这个变量。 以上语句不可重排 编译器不考虑多线程间的语义 可重排: a=1;b=2; 指令重排 会 破坏线程间的有序性。 如:
class OrderExample {
int a = 0;
boolean flag = false;

public void writer() {
    a = 1;                   
    flag = true;           
}

public void reader() {
    if (flag) {                
        int i =  a +1;      
        ……
    }
}
}
线程A首先执行writer()方法 线程B线程接着执行reader()方法 线程B在int i=a+1 是不一定能看到a已经被赋值为1 因为在writer中,两句话顺序可能打乱 线程A flag=true a=1 线程B flag=true(此时a=0) 避免指令重排:加上同步锁synchronized,当然,当保证同步时,就牺牲了程序的效率

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧