类的同步块

这个 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 ??
}
48980 次浏览

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

The second will get a lock on the current instance only.

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

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

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

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

补充其他答案:

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

is equivalent to

static synchronized void myMethod() {
//code
}

还有

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

相当于

synchronized void myMethod() {
//code
}

是的(在任何同步块/函数上)。

这几天我一直在思考这个问题(实际上是在科特林)。我终于找到了合理的解释,并想与大家分享:

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

类级别锁定应该始终进行,以确保静态数据线程的安全。正如我们所知道的,static 关键字将方法的数据关联到类级别,因此可以使用在静态字段或方法上的锁定使其位于类级别。

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

private final static Object lock = new Object();

where lock variable name is 同学们 and type is 类别 < T >

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