当首先加载类时,每个JVM只初始化一次java类。我认为不止一个线程可以尝试同时加载同一个类。 JVM如何处理这种争用?是否有任何机制可以阻止它发生,比如锁?
答案 0 :(得分:4)
首先,以下陈述不准确:
每个jvm
只初始化一次java类
每个类加载器初始化一次Java类。一个JVM实例可能有几个类加载器,每个类加载器分别加载同一个类。
要回答这个问题 - 是的,类加载器必须在加载类时锁定。例如,如果你看一下OpenJDK 9的java.lang.ClassLoader
实现,加载一个类最终会归结为以下方法(添加注释以强调锁定):
final Class<?> loadClass(Module module, String name) {
synchronized (getClassLoadingLock(name)) { // Note the locking here!
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
c = findClass(module.getName(), name);
}
if (c != null && c.getModule() == module) {
return c;
} else {
return null;
}
}
}