gpt4 book ai didi

java - 默认方法一会返回true,然后返回false? (可能的 JVM 错误)

转载 作者:IT老高 更新时间:2023-10-28 13:52:39 24 4
gpt4 key购买 nike

我对以下代码有疑问,我将其隔离为最封闭的形式,我使用的是 Java 8,它几乎已准备好发布(2014 年 3 月 18 日),所以我预计实现本身不会出现严重问题,所以它可能/必须是我自己的代码:

注意:代码是用Java 8编写的,具有各种新特性,包括接口(interface)中的default方法实现。

public abstract class Drawable implements DrawableInterface {    

}

interface DrawableInterface {
default public boolean isShadowReceiver() {
return false;
}

default public boolean isShadowCaster() {
return false;
}
}

public interface ShadowDrawable extends DrawableInterface {
@Override
default public boolean isShadowReceiver() {
return true;
}

@Override
default public boolean isShadowCaster() {
return true;
}
}

public class Box extends Drawable implements ShadowDrawable {

}

public class IsolatedBug {
private final Box box;

private final List<Drawable> drawables;

public IsolatedBug() {
this.box = new Box();
this.drawables = new ArrayList<>();

drawables.add(box);
drawables.forEach(drawable -> System.out.println(drawable + " C=" + drawable.isShadowCaster() + "/R=" + drawable.isShadowReceiver()));
}

private void init() throws InterruptedException {
while (true) {
drawables.forEach(drawable -> System.out.println(drawable + " C=" + drawable.isShadowCaster() + "/R=" + drawable.isShadowReceiver()));
Thread.sleep(100);
}
}

public static void main(String[] args) throws InterruptedException {
new IsolatedBug().init();
}
}

代码本身可能没有多大意义,但那是因为我已经剥离了许多其他不相关的方法。

但是,当您观察输出时,您会看到一些奇怪的东西,在某个时刻,对于我个人而言,30 秒后,我看到以下内容:

isolatedbug.Box@5acf9800 C=true/R=true
isolatedbug.Box@5acf9800 C=true/R=true
isolatedbug.Box@5acf9800 C=true/R=true
isolatedbug.Box@5acf9800 C=true/R=true
isolatedbug.Box@5acf9800 C=false/R=false
isolatedbug.Box@5acf9800 C=false/R=false
isolatedbug.Box@5acf9800 C=false/R=false
isolatedbug.Box@5acf9800 C=false/R=false
isolatedbug.Box@5acf9800 C=false/R=false
isolatedbug.Box@5acf9800 C=false/R=false

true 切换到 false 的时间,似乎取决于调用方法的次数,因为两者之间的 sleep 时间越长,切换所需的时间就越长.

我正在运行它,以获取有关 Windows 8 64 位的完整信息,使用 as java -version:

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b129)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b69, mixed mode)

谁能给我解释一下这是怎么回事?
如果其他使用 Java 8(任何版本)的人可以运行并查看他们是否有同样的问题,我也将不胜感激。

使用此代码后的更多信息:

  Properties p = System.getProperties();
p.list(System.out);

输出:

-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jdk1.8.0\jre\bin
java.vm.version=25.0-b69
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=NL
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=C:\Users\Frank\Dropbox\NetbeansProjec...
java.runtime.version=1.8.0-b129
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0\jre\li...
os.arch=amd64
java.io.tmpdir=C:\Users\Frank\AppData\Local\Temp\
line.separator=

java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 8.1
sun.jnu.encoding=Cp1252
java.library.path=C:\Program Files\Java\jdk1.8.0\bin;C:...
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=6.3
user.home=C:\Users\Frank
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
user.name=Beheerder
java.class.path=C:\Users\Frank\Dropbox\NetbeansProjec...
java.vm.specification.version=1.8
sun.arch.data.model=64
java.home=C:\Program Files\Java\jdk1.8.0\jre
sun.java.command=isolatedbug.IsolatedBug
java.specification.vendor=Oracle Corporation
user.language=nl
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0
java.ext.dirs=C:\Program Files\Java\jdk1.8.0\jre\li...
sun.boot.class.path=C:\Program Files\Java\jdk1.8.0\jre\li...
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64

我还检查了 -Xint VM 选项,当它被使用时,它会按预期返回 true

所以结论似乎是在我的特定用例中,代码的解释和 JIT 编译/内联变体是不一样的,因此有可能在编译解释代码后它从解释切换到编译从而阐明输出中的切换。

-Xint 选项添加到发生错误的实际程序中,也解决了那里的问题。

官方错误报告已被接受:JIRA Bug JDK-8036100

最佳答案

这是 Java8 中的一个已知错误。

查看此 Jira:CHA ignores default methods during analysis leading to incorrect code generation

This blog entry is enlightening ....

更新/总结:


以前的笔记

我已通过以下方式重现此问题:

声称在 b127 中解决了这个问题令人困惑,因为我在 b129 中清楚地看到了它(除非我对 JVM 版本约定感到困惑......)

C:\Java8\jdk-1.8.0_01\bin>java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b129)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b69, mixed mode)

C:\Java8\jdk-1.8.0_01\bin>

添加 System.out.println(System.getProperties());

{
java.runtime.name=Java(TM) SE Runtime Environment,
java.runtime.version=1.8.0-b129,
java.vm.specification.name=Java Virtual Machine Specification,
java.vm.name=Java HotSpot(TM) 64-Bit Server VM,
java.vm.version=25.0-b69,
java.vm.vendor=Oracle Corporation,
java.vendor.url=http://java.oracle.com/,
java.vm.specification.version=1.8,
java.specification.name=Java Platform API Specification,
java.specification.version=1.8,
java.specification.vendor=Oracle Corporation,
java.class.version=52.0,
sun.boot.library.path=C:\Java8\jdk-1.8.0_01\jre\bin,
sun.java.launcher=SUN_STANDARD,
sun.os.patch.level=Service Pack 1,
java.endorsed.dirs=C:\Java8\jdk-1.8.0_01\jre\lib\endorsed,
os.arch=amd64,
java.vm.specification.vendor=Oracle Corporation,
os.name=Windows 7,
sun.jnu.encoding=Cp1252,
java.library.path=C:\Java8\jdk-1.8.0_01\bin;......,
sun.management.compiler=HotSpot 64-Bit Tiered Compilers,
os.version=6.1,
file.encoding=UTF-8,
sun.java.command=fromso.IsolatedBug,
java.home=C:\Java8\jdk-1.8.0_01\jre,
sun.arch.data.model=64,
user.language=en,
java.ext.dirs=C:\Java8\jdk-1.8.0_01\jre\lib\ext;C:\windows\Sun\Java\lib\ext,

sun.boot.class.path=C:\Java8\jdk-1.8.0_01\jre\lib\resources.jar;......,
java.vendor=Oracle Corporation,
file.separator=\,
java.vendor.url.bug=http://bugreport.sun.com/bugreport/,
sun.io.unicode.encoding=UnicodeLittle,
sun.cpu.endian=little,
sun.desktop=windows,
sun.cpu.isalist=amd64
}

关于java - 默认方法一会返回true,然后返回false? (可能的 JVM 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22096052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com