灌个水。刚才在读
JVMCI的代码的时候看到了这样的一段:
@SuppressWarnings("try")
public JVMCIBackend createJVMCIBackend(HotSpotJVMCIRuntimeProvider runtime, JVMCIBackend host) {
assert host == null;
AMD64HotSpotVMConfig config = new AMD64HotSpotVMConfig(runtime.getConfigStore());
TargetDescription target = createTarget(config);
RegisterConfig regConfig;
HotSpotCodeCacheProvider codeCache;
ConstantReflectionProvider constantReflection;
HotSpotMetaAccessProvider metaAccess;
StackIntrospection stackIntrospection;
try (InitTimer t = timer("create providers")) {
try (InitTimer rt = timer("create MetaAccess provider")) {
metaAccess = createMetaAccess(runtime);
}
try (InitTimer rt = timer("create RegisterConfig")) {
regConfig = createRegisterConfig(config, target);
}
try (InitTimer rt = timer("create CodeCache provider")) {
codeCache = createCodeCache(runtime, target, regConfig);
}
try (InitTimer rt = timer("create ConstantReflection provider")) {
constantReflection = createConstantReflection(runtime);
}
try (InitTimer rt = timer("create StackIntrospection provider")) {
stackIntrospection = new HotSpotStackIntrospection(runtime);
}
}
try (InitTimer rt = timer("instantiate backend")) {
return createBackend(metaAccess, codeCache, constantReflection, stackIntrospection);
}
}
看到里面的那些try块了么?它们全都是try-with-resource语句,而这个InitTimer类就是特意迎合Java 7/8的try-with-resources的设计而写的RAII风格的类:
/**
* A facility for timing a step in the runtime initialization sequence. This is independent from all
* other JVMCI code so as to not perturb the initialization sequence. It is enabled by setting the
* {@code "jvmci.inittimer"} system property to {@code "true"}.
*/
public final class InitTimer implements AutoCloseable {
private final String name;
private final long start;
private InitTimer(String name) {
// ...
this.name = name;
this.start = System.currentTimeMillis();
System.out.println("START: " + SPACES.substring(0, n * 2) + name);
}
@SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", justification = "only the initializing thread accesses this field")
public void close() {
final long end = System.currentTimeMillis();
// ...
System.out.println(" DONE: " + SPACES.substring(0, n * 2) + name + " [" + (end - start) + " ms]");
if (n == 0) {
initializingThread = null;
}
}
// ...
}在构造器里写初始化动作,然后在close()方法里写结束动作,放在try-with-resources语句里自动在离开作用域时执行结束动作。这跟C++的RAII风格的代码用法非常相似,喜闻乐见哇。