Java中按位和操作的随机错误结果

Mag*_*Mag 5 java jit jvm

以下测试对随机 i 失败:

    @Test
    public void test() {
        for (int i = 0; i < 1_000_000; i++) {
            boolean isTrue = and128(new byte[] {-1});

            if (!isTrue) {
                fail("broken: " + i + " " + isTrue);
                break;
            }
            clearCache();
        }
    }

    private void clearCache() {
        for (int i = 0; i < 100; i++) {
            and128(new byte[] {(byte) i});
        }
    }

    public static boolean and128(byte[] byteData) {
        return ((byteData[0] & 128) > 0);
    }
Run Code Online (Sandbox Code Playgroud)

由于随机性,我会责怪 Java 运行时。如果我内联方法and128,则无法重现该问题。此外,如果我只传递一个字节而不是字节数组,则测试通过。我正在使用 OpenJDK 14.0.2。问题似乎已在 15.0.2 中修复。它似乎仍然存在于 15.0.1 中,我找不到与此相对应的错误。

编辑:我添加了这个“clearCache”方法,它只是在侧面运行,使错误更容易重现。我想它会阻止一些 Java 优化。