我试图简单地测试JLS保证的最终字段的初始化安全性.这是我写的一篇论文.但是,根据我当前的代码,我无法让它"失败".有人可以告诉我我做错了什么,或者这只是我必须反复运行然后看到一个不幸的时机失败?
这是我的代码:
public class TestClass {
final int x;
int y;
static TestClass f;
public TestClass() {
x = 3;
y = 4;
}
static void writer() {
TestClass.f = new TestClass();
}
static void reader() {
if (TestClass.f != null) {
int i = TestClass.f.x; // guaranteed to see 3
int j = TestClass.f.y; // could see 0
System.out.println("i = " + i);
System.out.println("j = " + j);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的线程正在调用它:
public class TestClient {
public static void …Run Code Online (Sandbox Code Playgroud) 我试图理解Java的Object的hashCode(),并看到Java Object的hashCode()方法的以下代码:
package java.lang;
public class Object {
// Some more code
public native int hashCode();
// Some other code
}
Run Code Online (Sandbox Code Playgroud)
package com.example.entity;
public class FirstClass {
private int id;
private String name;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
所以,这个类即:隐式FirstClass扩展Object类.
package com.example.app.main;
import com.example.entity.FirstClass;
public class MainApp {
public static void main(String[] args) {
FirstClass fs = new FirstClass();
fs.setId(1);
fs.setName("TEST");
System.out.println("The hasCode for object fs is " + fs.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
正如隐式FirstClass扩展 …
我的JVM有-server选择,我相信它使JVM能够使用C2编译器,该编译器旨在用于服务器应用程序,该服务器应用程序的运行时间通常比客户端运行时间更长。但是,GRAAL JIT(由启用-XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler)旨在替换C2,即使我同时提供以下两个选项,我的JVM也会启动。
-server -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler
最终使用哪个编译器?JIT还是C2?