Jave如何防止并发类初始化?

时间:2017-10-10 15:04:13

标签: java class jvm

当首先加载类时,每个JVM只初始化一次java类。我认为不止一个线程可以尝试同时加载同一个类。 JVM如何处理这种争用?是否有任何机制可以阻止它发生,比如锁?

1 个答案:

答案 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;
        }
    }
}