A documentação do Java diz:
Não é possível intercalar duas invocações de métodos sincronizados no mesmo objeto.
O que isso significa para um método estático? Como um método estático não possui um objeto associado, a palavra-chave sincronizada será bloqueada na classe, em vez do objeto?
this
é o bloqueio adquirido nos métodos de instância -, por favor, corrija-o Oscar.Apenas para adicionar um pequeno detalhe à resposta de Oscar (agradavelmente sucinta!), A seção relevante na Especificação da linguagem Java é 8.4.3.6, 'Métodos sincronizados' :
fonte
Um ponto sobre o qual você deve ter cuidado (vários programadores geralmente caem nessa armadilha) é que não há vínculo entre métodos estáticos sincronizados e métodos não estáticos sincronizados, ou seja:
A Principal:
Tópico 1:
Tópico 2:
f () eg () não são sincronizados entre si e, portanto, podem ser executados de forma totalmente simultânea.
fonte
synchronized (MyClass.class) {...}
,.A menos que você implemente g () da seguinte maneira:
Acho esse padrão útil também quando quero implementar exclusão mútua entre diferentes instâncias do objeto (o que é necessário ao acessar um recurso externo, por exemplo).
fonte
getClass()
retorna o tipo de tempo de execução ; se você subclassificar a classe, a classe pai e a classe filho serão sincronizadas em bloqueios diferentes.synchronized(MyClass.class)
é o caminho a percorrer se você precisar garantir que todas as instâncias usem o mesmo bloqueio.Dê uma olhada na página de documentação da Oracle em Bloqueios intrínsecos e sincronização
fonte
Um método estático também tem um objeto associado. Pertence ao arquivo Class.class no kit de ferramentas JDK. Quando o arquivo .class é carregado no ram, o Class.class cria uma instância chamada objeto de modelo.
Por exemplo: - quando você tenta criar um objeto da classe de cliente existente, como
O Customer.class é carregado na RAM. Nesse momento, Class.class no JDK toolkit cria um objeto chamado Template objeto e carrega esse Customer.class nesse objeto de modelo. Os membros estáticos dessa Customer.class tornam-se atributos e métodos nesse objeto de modelo.
Portanto, um método ou atributo estático também tem um objeto
fonte
Os exemplos abaixo dão mais clareza entre bloqueio de classe e objeto; a esperança de que o exemplo abaixo também ajude outras pessoas :)
Por exemplo, temos os métodos abaixo: uma classe de aquisição e outra aquisição de bloqueio de objeto:
Portanto, agora podemos ter os seguintes cenários:
Quando threads que usam o mesmo objeto tentam acessar o método
objLock
OR aostaticLock
mesmo tempo (ou seja, ambos os threads estão tentando acessar o mesmo método)Quando threads usando o mesmo objeto tentam acessar
staticLock
eobjLock
métodos ao mesmo tempo (tentam acessar métodos diferentes)Quando threads usando Object diferente tentam acessar o
staticLock
métodoQuando threads usando Object diferente tentam acessar o
objLock
métodofonte
Para aqueles que não são familiarizados com o método sincronizado estático bloqueado no objeto de classe, por exemplo, para a classe string, seu String.class enquanto o método sincronizado de instância bloqueia a instância atual de Object denotada pela palavra-chave "this" em Java. Como os dois objetos são diferentes, eles têm bloqueios diferentes. Enquanto um thread executa o método estático sincronizado, outro thread no java não precisa esperar o retorno do thread; ele adquirirá literalmente byte .class de bloqueio separado e entrará em método sincronizado estático.
fonte