【问题标题】:Implicit locking - what actually gets locked隐式锁定 - 实际锁定的内容
【发布时间】:2014-11-11 04:38:20
【问题描述】:

我的问题几乎等同于这个What is a class level lock in java

但这是一个后续问题。

实例级锁定通过锁定实例/对象的关联监视器来工作,但在类级锁定的情况下,谁扮演监视器的角色?隐式锁定是如何工作的?

谢谢你

【问题讨论】:

  • 将锁定视为“类级别”或“对象级别”只会分散您对锁定真正含义的注意力。当您编写synchronized 时,您应该考虑您的代码在哪个对象上同步,以及线程在该对象上同步在您的程序中意味着什么。当您在类 Foo 的静态方法上添加 synchronized 作为声明说明符时,这与在方法主体中编写 synchronized (Foo.class) { ... } 相同。在 Foo.class 上同步时,允许线程执行什么操作完全由您决定。
  • 不,锁定的真正含义是毫无疑问的。我的疑问是在类级别锁定的情况下实际被锁定的内容。谢谢你的时间。
  • 对不起,有时我假设太多了。

标签: java multithreading static synchronization


【解决方案1】:

在 Java 中,为了在面向对象的上下文中获得 class 表示,创建了 Class 类。

因此,当您获得类级锁时,在静态上下文中,您将获得该“类名”的 Class 对象实例的关联监视器。

public class com.buck.Foo {

}

例如,在类型等同于的东西上会有一个“类级别锁”

Class<com.buck.Foo> clazz = Foo.class;

措辞可能很奇怪,但请注意大小写。

class is a keyword

Class is a type that represents a "class instance"

Foo.class is a convention to refer to an instance which has the type "Class<Foo>"

clazz is a variable which can accept the instance of type "Class<Foo>"

【讨论】:

  • 所以这个对象在类加载器级别被初始化?如果是,那么 v 可以多次初始化它吗?
  • @AnkitSharma 是的,它使用类加载器进行初始化。在类加载器中,它通常不会被初始化两次(类加载器将重用Class 实例);然而,它很容易在两个类加载器中初始化两次,或者通过其他方式(通常涉及序列化或反射)。一些较旧的 单例模式 技术在处理多个“单例”类时存在问题,因为没有考虑所有加载类的方式。如果你好奇的话,看看那些“单例实现问题”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多