今天分享一个JDK中令人惊讶的BUG,这个BUG的神奇之处在于,复现它的用例太简单了,人肉眼就能回答的问题,JDK中却存在了十几年。经过测试,我们发现从JDK8到14都存在这个问题。大家可以在自己的开发平台上试试这段代码:public class Hello {
public void test() {
int i = 8;
while ((i -= 3) > 0);
System.out.println("i = " + i);
}
public static void main(String[] args) {
Hello hello = new Hello();
for (int i = 0; i < 50_000; i++) {
hello.test();
}
}
}再使用以下命令执行: java Hello然后,就会看到这样的输出:当然,在程序的开始阶段,还是能打印出正确的"i = -1"。这个问题最终Huawei JDK的两名同事解决掉了,并且回合到社区。我这里大概讲一下分析的思路。首先,使用解释执行可以发现,结果都是正确的,这就说明,这基本上是JIT编译
………………………………