Could the JIT collapse two volatile reads as one in certain expressions?

后端 未结 5 677
礼貌的吻别
礼貌的吻别 2021-01-31 04:11

Suppose we have a volatile int a. One thread does

while (true) {
    a = 1;
    a = 0;
}

and another thread does

w         


        
5条回答
  •  星月不相逢
    2021-01-31 04:41

    Modified the OP Problem a little

       volatile int a
    
        //thread 1
        while (true) {
            a = some_oddNumber;
            a = some_evenNumber;
        }
    
        // Thread 2 
        while (true) {
            if(isOdd(a+a)) {
                break;
            }
        }
    

    If the above code have been executed Sequentially, then there exist a valid Sequential Consistent Execution which will break the thread2 while loop.

    Whereas if compiler optimizes a+a to 2a then thread2 while loop will never exist.

    So the above optimization will prohibit one particular execution if it had been Sequentially Executed Code.

    Main Question, is this optimization a Problem ?

    Q.   Is the Transformed code Sequentially Consistent.
    

    Ans. A program is correctly synchronized if, when it is executed in a sequentially consistent manner, there are no data races. Refer Example 17.4.8-1 from JLS chapter 17

       Sequential consistency: the result of any execution is the same as
       if the read and write operations by all processes were executed in
       some sequential order and the operations of each individual
       process appear in this sequence in the order specified by its
       program [Lamport, 1979].
    
       Also see http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.3
    

    Sequential Consistency is a strong guarantee. The Execution Path where compiler optimizes a+a as 2a is also a valid Sequentially Consistent Execution. So the Answer is Yes.

      Q.   Is the code violates happens before guarantees.
    

    Ans. Sequential Consistency implies that happens before guarantee is valid here . So the Answer is Yes. JLS ref

    So i don't think optimization is invalid legally at least in the OP case. The case where the Thread 2 while loops stucks into an infinte is also quite possible without compiler transformation.

提交回复
热议问题