公共代码消除是否会在JITed时优化这个双重检查?

时间:2016-12-30 06:33:23

标签: java

java.util.concurrent.AbstractQueuedSynchronzier

中找到以下代码
if (((h = head) != null && (s = h.next) != null &&
     s.prev == head && (st = s.thread) != null) ||
    ((h = head) != null && (s = h.next) != null &&
     s.prev == head && (st = s.thread) != null ))
    return st;

原始意图似乎检查两次以确保满足条件。

我的问题是:当这段代码命中JIT时,它是否会被优化,因为两张支票看起来完全相同?

1 个答案:

答案 0 :(得分:1)

  

我的问题是:当这段代码命中JIT时,它是否会被优化,因为两张支票看起来完全相同?

如果我们假设该long表达式中引用的字段不是volatile,那么,由于表达式中的字段没有赋值,因此允许JIT编译器假设没有其他内容会更改它们。这意味着允许优化第二次内存读取。

JIT编译器是否真的这样做可能是特定于平台的;即它取决于编译器版本,等等。