在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时,它是否会被优化,因为两张支票看起来完全相同?
答案 0 :(得分:1)
我的问题是:当这段代码命中JIT时,它是否会被优化,因为两张支票看起来完全相同?
如果我们假设该long表达式中引用的字段不是volatile
,那么,由于表达式中的字段没有赋值,因此允许JIT编译器假设没有其他内容会更改它们。这意味着允许优化第二次内存读取。
JIT编译器是否真的这样做可能是特定于平台的;即它取决于编译器版本,等等。