[英]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节)。
在初始化之前,必须链接一个类或接口,即验证,准备和可选地解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.