我的以下代码有问题,我隔离为最封闭的形式,我使用的是Java 8,该代码几乎可以启动了(2014年3月18日),因此我预计实现本身不会出现严重问题,因此可能/必须是我自己的代码:
注意:该代码是用Java 8编写的,它具有各种新功能,包括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
孤立的bug.Box@5acf9800 C = true / R = true
孤立的bug.Box@5acf9800 C = true / R = true
孤立的bug.Box@5acf9800 C = true / R = true
孤立的bug。 Box @ 5acf9800 C = false / R =假
isolatedbug.Box@5acf9800 C = false / R =假
isolatedbug.Box@5acf9800 C = false / R =假
isolatedbug.Box@5acf9800 C = false / R =假
isolatedbug.Box @ 5acf9800 C =错误/ R =错误
隔离错误.Box @ 5acf9800 C =错误/ R =错误
从切换true
到的时间false
似乎取决于该方法的调用次数,因为之间的睡眠时间较长,因此切换时间也更长。
我正在运行此程序,以获取有关Windows 8 64位的完整信息,并显示为java -version
:
Java版本“ 1.8.0”
Java™SE运行时环境(内部版本1.8.0-b129)
Java HotSpot(TM)64位服务器VM(内部版本25.0-b69,混合模式)
谁能告诉我发生了什么事?
我还要感谢其他使用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