无法理解Class对象

时间:2015-06-03 20:20:27

标签: java multithreading class synchronized

关于内部锁定和同步的Oracle Java文档说:

  

您可能想知道静态同步方法会发生什么   调用,因为静态方法与类关联,而不是   宾语。在这种情况下,线程获取内部锁   与类关联的类对象。因此可以访问类的静态   字段由锁定控制,该锁定与任何锁定不同   班级的实例。

我没有完全理解Class object的概念。在找到一些在线内容之后我会知道:

  

Class对象是一种描述对象类的元对象,如name,package等。

我的问题是:

  1. 什么时候创建?
  2. 是否在某个时间收集了垃圾?
  3. 由于它是由synchronized static方法使用的,它是否意味着每个JVM只有一个Class对象的实例?
  4. 有一个类似的问题what is Class Object(java.lang.class) in java。但它没有回答我的问题。

    [更新]

    manouti提供的答案的评论部分添加了一个新问题,因为他提到可能有多个Class对象实例:

    1. 如果存在多个Class对象实例,是否有可能同时由多个线程访问静态同步方法?

2 个答案:

答案 0 :(得分:9)

1。什么时候创建?

当JVM使用类加载器加载类时创建它。当某个类被其他类引用时,将加载该类。调用ClassLoader#loadClass(String className)时,ClassLoader通常会创建此Class个实例。这在this link from the Java Language Specification

中有解释
  

加载是指查找具有特定名称的类或接口类型的二进制形式的过程,可能是通过动态计算,但更常见的是通过检索先前从中计算的二进制表示Java编译器的源代码,并从该二进制形式构造一个Class对象来表示类或接口。

2。是否在某个时间点收集了垃圾?

与任何其他实例一样,如果Class实例不再可访问,则它符合GC的条件。当没有Class实例表示的类型的对象可访问时,会发生这种情况,并且加载该类的类加载器也不可访问。

3。由于它是由synchronized static方法使用的,它是否意味着每个JVM只有一个Class对象实例?

不一定。如果您定义了自定义类加载器,那么您可以有两个Class实例。在这种情况下,如果您尝试将某个类ClassCastException的对象转换为"相同的类型"您甚至可能会获得AA如果它们被两个不同的类加载器加载。

答案 1 :(得分:1)

  1. 来自Class上的JavaDocs:
  2.   

    Class没有公共构造函数。相反,类对象是在加载类时由Java虚拟机自动构造的,并且通过调用类加载器中的defineClass方法来构建。

    1. 只要正在使用类的实例并且Class对象的引用仍然存在,它就会保留在内存中。

    2. 是的。类是不可变的,因此没有真正的同步问题。