Bloco Sincronizado Java para .class

O que esse código java significa? Será que vai conseguir bloquear todos os objects do MyClass ?

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

E como o código acima difere deste:

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

O snippet synchronized(X.class) usa a instância da class como um monitor. Como há apenas uma instância de class (o object que representa os metadados da class no tempo de execução), um thread pode estar nesse bloco.

Com synchronized(this) o bloco é guardado pela instância. Para cada instância, apenas um thread pode entrar no bloco.

synchronized(X.class) é usado para garantir que exista exatamente um Thread no bloco. synchronized(this) garante que exista exatamente um thread por instância. Se isso fizer com que o código real no bloco thread-safe dependa da implementação. Se mutate apenas o estado da instância synchronized(this) é suficiente.

Para adicionar às outras respostas:

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

é equivalente a

 static synchronized void myMethod() { //code } 

e

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

é equivalente a

 synchronized void myMethod() { //code } 

Não, o primeiro receberá um bloqueio na definição de class do MyClass , nem todas as instâncias dele. No entanto, se usado em uma instância, isso bloqueará efetivamente todas as outras instâncias, pois elas compartilham uma única definição de class.

O segundo receberá um bloqueio apenas na instância atual.

Quanto a saber se isso torna seu segmento de objects seguro, essa é uma questão muito mais complexa – precisamos ver seu código!