关于内部锁定和同步的Oracle Java文档说:
您可能想知道静态同步方法会发生什么 调用,因为静态方法与类关联,而不是 宾语。在这种情况下,线程获取内部锁 与类关联的类对象。因此可以访问类的静态 字段由锁定控制,该锁定与任何锁定不同 班级的实例。
我没有完全理解Class object
的概念。在找到一些在线内容之后我会知道:
Class对象是一种描述对象类的元对象,如name,package等。
我的问题是:
有一个类似的问题what is Class Object(java.lang.class) in java。但它没有回答我的问题。
[更新]
manouti
提供的答案的评论部分添加了一个新问题,因为他提到可能有多个Class
对象实例:
答案 0 :(得分:9)
当JVM使用类加载器加载类时创建它。当某个类被其他类引用时,将加载该类。调用ClassLoader#loadClass(String className)
时,ClassLoader
通常会创建此Class
个实例。这在this link from the Java Language Specification:
加载是指查找具有特定名称的类或接口类型的二进制形式的过程,可能是通过动态计算,但更常见的是通过检索先前从中计算的二进制表示Java编译器的源代码,并从该二进制形式构造一个
Class
对象来表示类或接口。
与任何其他实例一样,如果Class
实例不再可访问,则它符合GC的条件。当没有Class
实例表示的类型的对象可访问时,会发生这种情况,并且加载该类的类加载器也不可访问。
不一定。如果您定义了自定义类加载器,那么您可以有两个Class
实例。在这种情况下,如果您尝试将某个类ClassCastException
的对象转换为"相同的类型"您甚至可能会获得A
。 A
如果它们被两个不同的类加载器加载。
答案 1 :(得分:1)
Class没有公共构造函数。相反,类对象是在加载类时由Java虚拟机自动构造的,并且通过调用类加载器中的defineClass方法来构建。
只要正在使用类的实例并且Class对象的引用仍然存在,它就会保留在内存中。
是的。类是不可变的,因此没有真正的同步问题。