java - java.lang.Class 的用途是什么以及它与静态方法同步有何关系?

标签 java multithreading

我正在阅读 java 中的静态方法同步。在我阅读 static methods 的地方,获取了 java.lang.class 对象的锁。我试图理解 java.lang.class 的概念及其在静态方法同步中的作用,但我有这些问题。

  1. 我正在阅读博客,其中说 Java 中的每个类都有一个 java.lang.Class 实例,并且一个类的所有实例都共享这个对象。 java.lang.Class 的实例描述了对象的类型? java.lang.Class在这里的作用是什么?它如何描述对象的类型?

  2. 其次静态方法同步,我们需要获取java.lang.Class的监听器。这是为什么?为什么我们需要锁定 java.lang.Class 监视器?为什么不在我们自己的类的实例上,例如 Test(我自己的自定义类)?

有人可以详细说明一下吗?我真的很抱歉,因为这听起来是一个非常基本的问题,但我对这个概念还很陌生。

最佳答案

暂时的解释,虽然不可否认它并不完全正确。对于任何类别 C ,当你这样做时:

final C c = new C();

两个Object这里涉及到:Class<C>对象(通过上下文类加载器提供)和 c实例。 c将通过它的 .getClass() 知道它是哪个类方法(在 Object 中定义)。

事实是 new关键字能够建立指向正确 Class 的“反向链接”是 JVM 实现的责任。虽然 JLS 中肯定提到了这一点,但我不知道在哪里......

现在,更重要的是。

如果你有一个方法声明为:

synchronized void whatever() { someCode(); }

那么它大致相当于(为什么粗略:见下文):

void whatever()
{
    synchronized(this) {
        someCode();
    }
}

也就是说,这段代码是在实例级别同步的。

但是,如果该方法是静态的,则:

public static synchronized void meh() { someOtherCode(); }

大致相当于(为什么大致:见下文):

public static void meh()
{
    synchronized(getClass()) {
        someOtherCode();
    }
}

需要注意的是所有Class对象是单例;无论有多少类 C 的实例你创造,.getClass()将始终返回相同的 Class目的。试试这个:

public static void main(final String... args)
{
    final String s1 = "foo";
    final String s2 = "bar";
    System.out.println(s1.getClass() == s2.getClass()); // true
}

添加一个事实 getClass()相当于this.getClass()你明白了。 Class本身就是一个 Object , 它遵守任何 Object 的监控规则.

因为在这里我们总是引用完全相同的对象,所以应用监控规则 ;)

现在,“大致”:在上面写的代码中,逻辑是一样的;但是,根据您编写该代码的方式,字节码可能会有所不同;但 JIT 将在其中拥有发言权,并最终优化代码路径。

关于java - java.lang.Class 的用途是什么以及它与静态方法同步有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18123275/

相关文章:

java - 防止静态 block 的继承

java - 为什么我不能强制 EditTextPreference 只取数字?

java - 递归Java方法中的返回语句不终止方法

java - 如何从 JNDI 加载 log4j2 配置文件

multithreading - 使用 NIO 或 Netty 等事件驱动框架时如何跟踪请求过程

c++ - 图像处理中的并发设计

python - 为什么Python线程一旦完成就不能再次运行?

java - JLabel 上的 setText 在 KeyPressed 方法中不起作用

c# - c# 和 java 的 volatile 关键字的行为是否相同?

java - 我的多线程分析