111

这个java代码是什么意思?它会锁定 的所有对象MyClass吗?

synchronized(MyClass.class) {
   //is all objects of MyClass are thread-safe now ??
}

以及上面的代码与这个代码有何不同:

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}
4

4 回答 4

154

该片段synchronized(X.class)使用类实例作为监视器。由于只有一个类实例(在运行时表示类元数据的对象),因此该块中可以有一个线程。

随着synchronized(this)块由实例看守。对于每个实例,只有一个线程可以进入块。

synchronized(X.class)用于确保块中只有一个线程。synchronized(this)确保每个实例只有一个线程。如果这使得块中的实际代码线程安全取决于实现。如果只改变实例的状态synchronized(this)就足够了。

于 2010-01-13T11:35:51.300 回答
91

要添加到其他答案:

static void myMethod() {
  synchronized(MyClass.class) {
    //code
  }
}

相当于

static synchronized void myMethod() {
  //code
}

void myMethod() {
  synchronized(this) {
    //code
  }
}

相当于

synchronized void myMethod() {
  //code
}
于 2010-01-13T12:45:27.377 回答
23

不,第一个将锁定 的类定义MyClass,而不是它的所有实例。但是,如果在一个实例中使用,这将有效地阻止所有其他实例,因为它们共享一个类定义。

第二个将仅锁定当前实例。

至于这是否使您的对象线程安全,这是一个更复杂的问题——我们需要查看您的代码!

于 2010-01-13T11:35:30.863 回答
0

是的(在任何同步块/功能上)。

我为自己想了几天这个问题(实际上是在 kotlin 中)。我终于找到了很好的解释并想分享它:

类级锁可防止多个线程在运行时进入类的所有可用实例中的同步块。这意味着如果在运行时有 100 个 DemoClass 实例,那么一次只有一个线程能够在任何一个实例中执行 demoMethod(),而所有其他实例都将被其他线程锁定。

应始终进行类级别锁定以使静态数据线程安全。众所周知,静态关键字将方法的数据与类级别相关联,因此在静态字段或方法上使用锁定使其在类级别上。

另外要注意为什么.class。只是因为.class它相当于类的任何静态变量,类似于:

private final static Object lock = new Object();

其中锁变量名称是,类型是Class<T>

阅读更多: https ://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/

于 2020-08-19T08:31:18.923 回答