吊装和重新订购同样的东西?

Inq*_*ive 12 java java-memory-model

我从Effective Java中读到,在没有同步的情况下,下面的序列A可以被虚拟机转换为序列B并调用它hoisting.我还在某处读到,如果变量未被声明为涉及变量的易失性指令,则可以重新排序.吊装和重新订购同样的东西?

  while (!done)    sequence A     
    i++;

  if (!done)
     while (true)    sequence B
        i++;
Run Code Online (Sandbox Code Playgroud)

mik*_*era 16

它们略有不同.

提升意味着您已将某些操作从循环中拉出,因为循环本身不会影响操作的结果.在您的情况下,您正在从while循环中提升条件测试.

重新排序意味着以不影响结果的方式更改指令序列.通常,这将是相邻的指令,没有数据依赖性,例如,执行以下两个语句的顺序无关紧要:

int a = x;
int b = y;
Run Code Online (Sandbox Code Playgroud)