我正在阅读 java 中的静态方法同步。在我阅读 static methods
的地方,获取了 java.lang.class
对象的锁。我试图理解 java.lang.class
的概念及其在静态方法同步中的作用,但我有这些问题。
我正在阅读博客,其中说 Java 中的每个类都有一个
java.lang.Class
实例,并且一个类的所有实例都共享这个对象。 java.lang.Class 的实例描述了对象的类型? java.lang.Class在这里的作用是什么?它如何描述对象的类型?其次静态方法同步,我们需要获取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/