Java 无法理解类对象

Java 无法理解类对象,java,multithreading,class,synchronized,Java,Multithreading,Class,Synchronized,关于内部锁和同步的Oracle Java文档说明: 您可能想知道当使用静态同步方法时会发生什么 调用,因为静态方法与类关联,而不是 对象在这种情况下,线程获取 与该类关联的类对象。这样就可以访问类的静态 字段由一个锁控制,该锁不同于任何字段的锁 类的实例 我没有完全理解类对象的概念。在学习了一些在线内容后,我了解到: 类对象是一种元对象,描述对象的类,如名称、包等 我的问题是: 它是什么时候创建的 它是在某个时候收集的垃圾吗 由于同步静态方法使用它,这是否意味着每个JVM只有一个类对象实例 还有

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

您可能想知道当使用静态同步方法时会发生什么 调用,因为静态方法与类关联,而不是 对象在这种情况下,线程获取 与该类关联的类对象。这样就可以访问类的静态 字段由一个锁控制,该锁不同于任何字段的锁 类的实例

我没有完全理解
类对象
的概念。在学习了一些在线内容后,我了解到:

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

我的问题是:

  • 它是什么时候创建的
  • 它是在某个时候收集的垃圾吗
  • 由于同步静态方法使用它,这是否意味着每个JVM只有一个类对象实例
  • 还有一个类似的问题。但它不能回答我的问题

    [更新]

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

  • 如果存在类对象的多个实例,静态同步方法是否有可能被多个线程同时访问
  • 从上的JavaDocs:
  • 类没有公共构造函数。相反,类对象在类加载时由Java虚拟机自动构造,并通过调用类加载器中的defineClass方法来构造

  • 只要类的实例在使用中,并且对类对象的引用仍然存在,它就会留在内存中

  • 是的。类是不可变的,因此不存在真正的同步问题

  • 1.它是什么时候创建的? 它是在JVM使用类加载器加载类时创建的。当某个类被其他类引用时,将加载该类。调用时,
    ClassLoader
    通常会创建这个
    Class
    实例。下文对此进行了解释:

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

    2.它是在某个时候收集的垃圾吗? 与任何其他实例一样,如果
    实例不再可访问,则它符合GC的条件。当
    实例表示的类型的对象不可访问,并且加载该类的类加载器也不可访问时,就会发生这种情况

    3.由于同步静态方法使用它,这是否意味着每个JVM只有一个类对象实例?
    不一定。如果定义一个自定义类加载器,那么可以有两个
    类的实例。在这种情况下,如果您试图将某个类的对象
    a
    转换为“相同类型”
    a
    ,如果它们由两个不同的类加载器加载,您甚至可能会得到
    ClassCastException

    这是否意味着创建任何类的第一个实例时,JVM将自动创建
    的实例。如果我们创建同一类的更多对象,那么不会创建其他类对象吗?当最后一个活动实例被垃圾收集时,是否有资格进行垃圾收集?我猜你没有回答我的最后一个问题。@Kartic,是的,如果你有
    Foobar f1=new Foobar()
    Foobar f2==new Foobar()
    ,然后
    f1.getClass()
    f2.getClass()
    将始终返回相同的对象引用。解释得很好+1。关于最后一点,有一个问题:如果存在类对象的多个实例,那么静态同步方法是否有可能被多个线程同时访问?关于
    Class
    对象集合,JLS()规定引导类加载器加载的类不能卸载,
    Class
    卸载被视为一种内存优化,但在某些情况下,类加载可能是一项代价高昂的操作,完全禁用
    Class
    卸载(例如,存储速度非常慢的嵌入式环境)@Kartic Yes,如果两个线程分别通过两个线程锁定加载的
    Class
    实例“恶意”类加载器。通常情况下(当你没有搞乱类加载器时),情况不应该是这样的:两个线程会锁定在同一个类实例上。不能有同一个类对象的两个加载实例