用于.class的 Java 同步块

这个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 ??
}

答案 1

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

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

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


答案 2

要添加到其他答案:

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

等效于

static synchronized void myMethod() {
  //code
}

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

等效于

synchronized void myMethod() {
  //code
}