【问题标题】:Unable to understand Class object无法理解类对象
【发布时间】:2015-06-03 20:20:26
【问题描述】:

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

你可能想知道当一个静态同步方法是 调用,因为静态方法与类相关联,而不是 目的。在这种情况下,线程为 与类关联的类对象。从而访问类的静态 字段由不同于任何锁的锁控制 类的实例。

我没有完全理解Class object 的概念。在研究了一些在线内容后,我了解到:

类对象是一种描述对象类的元对象,例如名称、包等。

我的问题是:

  1. 什么时候创建的?
  2. 是否在某个时间点收集垃圾?
  3. 由于是同步静态方法使用的,是不是意味着每个JVM只有一个Class对象的实例?

有一个类似的问题what is Class Object(java.lang.class) in java。但它没有回答我的问题。

[更新]

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

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

【问题讨论】:

  • 你不能有 2 个加载的同一个类对象的实例

标签: java multithreading class synchronized


【解决方案1】:

1。什么时候创建的?

它是在 JVM 使用类加载器加载类时创建的。一个类在被其他类引用时被加载。 ClassLoader 通常在调用 ClassLoader#loadClass(String className) 时创建此 Class 实例。这在this link from the Java Language Specification 中有解释:

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

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

就像任何其他实例一样,如果 Class 实例不再可访问,则它有资格进行 GC。当Class 实例所代表的类型的对象无法访问,并且加载该类的类加载器也无法访问时,就会发生这种情况。

3。由于是同步静态方法使用的,是不是意味着每个JVM只有一个Class对象的实例?

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

【讨论】:

  • 很好地解释了+1。关于最后一点的一个问题:如果存在多个 Class 对象实例,是否有可能多个线程同时访问静态同步方法?
  • 只是关于Class对象集合的附加说明,JLS (docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.7) 指定引导类加载器加载的类可能不会被卸载,Class卸载被视为内存优化,但在某些情况下,类加载可能是一项代价高昂的操作,完全禁用 Class 卸载可能是有意义的(例如,存储速度非常慢的嵌入式环境)
  • @Kartic 是,如果两个线程锁定 Class 实例,由两个“恶意”类加载器分别加载。但通常情况下(当您不使用类加载器时),情况并非如此:两个线程将锁定同一个 Class 实例。
【解决方案2】:
  1. 来自Class 上的 JavaDocs:

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

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

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

【讨论】:

  • 这是否意味着当任何类的第一个实例被创建时,JVM会自动创建一个Class的实例。如果我们创建更多同一个类的对象,就不会创建其他类对象吗?并且当最后一个活着的实例是垃圾收集时,是否有资格进行垃圾收集?我猜你没有得到我的最后一个问题。
  • @Kartic,是的,如果您有Foobar f1 = new Foobar();Foobar f2 == new Foobar(),那么f1.getClass()f2.getClass() 将始终返回相同的对象引用。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多