繁体   English   中英

是与java classloader相关的类锁定?

[英]is class locking related to java classloader?

看起来我缺少关于锁定类的重要概念及其相关的类加载事件。根据我在java中的知识,只有当classloader已经在内存中加载了类(字节代码)时,我们才能使用任何类。 基于这个假设,我认为“在下面的代码中执行语句同步(SharedQ.class){...}时,应该执行”SharedQ类的静态块“。 但那不一样。 任何人都可以请完整地解释这里发生的事情。

public class VerifyClassLoadingOnClassLock {
    public static void main(String[] args) {
        show();
    }

    private static void show() {
        synchronized (SharedQ.class) {
            System.out.println(" Method Show() executing from Main() .... ");
        }       
    }
} 



public class SharedQ {  
    static {
        System.out.println(" Classloader is loading SharedQ ");
    }

    public static void writeStream() {
        // some multiThread code here
    }
}

输出为: Method Show() executing from Main() ....

该类已加载 ,但未必初始化 基本上,当您对其进行同步时,有一个Class对象可用,但是在某些东西使用该类的成员之前,它不必初始化。

JVM规范部分5.5

类或接口的初始化包括执行其类或接口初始化方法(第2.9节)。

只有以下结果才能初始化类或接口:

  • 执行引用类或接口的任何一个Java虚拟机指令new,getstatic,putstatic或invokestatic(§new,§getstatic,§putstatic,§invokestatic)。 所有这些指令都通过字段引用或方法引用直接或间接引用类。
  • 在执行新指令时,如果尚未初始化引用的类或接口,则对其进行初始化。
  • 执行getstatic,putstatic或invokestatic指令后,如果尚未初始化,则声明已解析的字段或方法的类或接口已初始化。
  • 第一次调用java.lang.invoke.MethodHandle实例,该实例是Java虚拟机(第5.4.3.5节)解析方法句柄并且具有2种类型(REF_getStatic),4(REF_putStatic)的结果,或6(REF_invokeStatic)。
  • 在类库(第2.12节)中调用某些反射方法,例如,在类Class或包java.lang.reflect中。
  • 其子类之一的初始化。
  • 它被指定为Java虚拟机启动时的初始类(第5.2节)。

在初始化之前,必须链接一个类或接口,即验证,准备和可选地解析。

规范的第5节对所有这些进行了很多讨论 - 特别是它区分了加载,链接和验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM