Pergunta

O que esse código Java significa? Ele ganhará bloqueio em todos os objetos de MyClass?

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

E como o código acima difere desta:

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

Solução

O trecho synchronized(X.class) usa a instância da classe como monitor. Como existe apenas uma instância de classe (o objeto que representa os metadados da classe em 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 thread de blocos segura depende da implementação. Se muta apenas estado da instância synchronized(this) basta.

Outras dicas

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 classe de MyClass, nem todas as instâncias disso. No entanto, se usado em uma instância, isso bloqueará efetivamente todas as outras instâncias, pois elas compartilham uma única definição de classe.

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

Se isso torna seus objetos seguros, essa é uma pergunta muito mais complexa - precisamos ver seu código!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top