gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:59 25 4
gpt4 key购买 nike

我正在阅读 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com