16

I read from Effective Java that In the absence of synchronization the following sequence A below can be converted into sequence B by the virtual machine and this is called hoisting. I also read somewhere that if variables are not declared as volatile instructions involving the variables can be reordered . Are hoisting and reordering the same thing?

  while (!done)    sequence A     
    i++;

  if (!done)
     while (true)    sequence B
        i++;
Inquisitive
  • 7,476
  • 14
  • 50
  • 61
  • possible duplicate of [why hotspot will optimize the following using hoisting?](http://stackoverflow.com/questions/9338180/why-hotspot-will-optimize-the-following-using-hoisting) – Mike Argyriou Sep 02 '14 at 13:48

3 Answers3

22

They are slightly different.

Hoisting means that you have pulled some operation out of a loop because the loop itself does not affect the result of the operation. In your case, you are hoisting the conditional test out of the while loop.

Re-ordering means changing the sequence of instructions in a way that does not affect the result. Typically this would be adjacent instructions with no data dependencies, e.g. it does not matter which order you perform the following two statements:

int a = x;
int b = y;
mikera
  • 105,238
  • 25
  • 256
  • 415
1

The term "reordering" as it's used in the Java Memory Model refers to all possible optimizations that may affect correctness of improperly synchronized programs.

So, reordering in this sense is a generic term that includes optimizations such as hoisting, effects of out-of-order execution, inconsistencies caused by memory hierarchy (i.e. caches), and so on.

axtavt
  • 239,438
  • 41
  • 511
  • 482
0

Reordering relates to performance of execution where as reordering doesn't impact performance.

Hoisting is done to reordering of Memory barrier instructions.

Marko Topolnik
  • 195,646
  • 29
  • 319
  • 436
amicngh
  • 7,831
  • 3
  • 35
  • 54