用于.class的Java同步块

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

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

以上代码与这个代码有什么不同:

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

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

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

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

要添加到其他答案:

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

相当于

 static synchronized void myMethod() { //code } 

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

相当于

 synchronized void myMethod() { //code } 

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

第二个将仅在当前实例上获得locking。

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