O que esse código Java significa? Ele ganhará travamento 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 deste:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
java
multithreading
synchronization
locking
synchronized
Andrew Tobilko
fonte
fonte
Respostas:
O snippet
synchronized(X.class)
usa a instância da classe como um monitor. Como há apenas uma instância de classe (o objeto que representa os metadados da classe em tempo de execução), um thread pode estar neste bloco.Com
synchronized(this)
o bloqueio fica guardado pela instância. Para cada instância, apenas um thread pode entrar no bloco.synchronized(X.class)
é usado para garantir que haja exatamente um Thread no bloco.synchronized(this)
garante que haja exatamente um encadeamento por instância. Se isso torna o código real no bloco seguro para thread, depende da implementação. Se mutate, apenas o estado da instânciasynchronized(this)
é suficiente.fonte
Para adicionar às outras respostas:
é equivalente a
e
é equivalente a
fonte
synchronized
blocos. Isso os torna equivalentes. Se você mudar um exemplo, eles realmente não são mais os mesmos.Não, o primeiro obterá um bloqueio na definição de classe de
MyClass
, nem todas as instâncias dela. No entanto, se usado em uma instância, isso bloqueará efetivamente todas as outras instâncias, uma vez que compartilham uma única definição de classe.O segundo obterá um bloqueio apenas na instância atual.
Se isso torna seu thread de objetos seguro, essa é uma questão muito mais complexa - precisaríamos ver seu código!
fonte