0

根据我对Java类的了解

  1. 非静态同步方法:获取特定对象的锁
  2. 静态同步方法:类上的锁获取

我对此有点困惑,因为我们可以通过类名或对象名调用静态方法。

请假设有 4 种方法是我的类都是同步的。2 个方法是静态的,2 个是非静态的。如果我将创建我的类“obj1”的 1 个对象,并且还有 2 个线程 Thread1 和 Thread2

问题 1:如果我将尝试使用 obj1(或类名)访问静态同步方法。这是否意味着“obj1”上没有锁定只有 2 个静态方法将被锁定(类级锁定)?意味着其他线程可以同时使用“obj1”访问非静态方法但不能访问静态方法?

问题 2:如果我将尝试访问非静态同步方法,使用 Thread1 中的 obj1。这是否意味着 Thread2 只锁定了 2 个方法?意味着 Thread2 可以访问 2 个静态方法,或者我们也可以同时使用 className(MyClass) 访问静态方法

问题 3:如果我的类中的所有方法都是静态的并且是同步的。这是否意味着将没有对象级别的锁,并且所有线程只有一个类级别的锁。?

请稍微解释一下类级别锁

提前致谢。

4

1 回答 1

12

即使您使用

someObject.staticMethod()

它不会改变锁在 Class 对象上的事实。这只是意味着您以一种令人困惑的方式调用静态方法,您应该正确调用它。仅仅因为它工作得很好,并不意味着它应该被使用(除非你打算让你的代码不那么可读)。

类级别锁没有什么特别之处。它只是使用 Class 对象而不是实例,并且由于所有静态同步都使用相同的 Class 对象,因此它的工作方式与它一样。

至于你的最后一个问题,是的。如果您只有静态同步方法,那么无论您创建了多少类实例,它们都将共享 Class 对象作为它们的锁。

于 2013-08-17T13:16:26.650 回答