Existe algum método que não aceita a palavra chave "synchronized"?
3 respostas
T
TiagoTC
Estava fazendo alguns testes aqui e, pelo que pude ver, todos os métodos aceitam o uso da palavra chave syncronized em suas declarações. Por exemplo, o método main() aceita, equals(), hashCode(), qualquer método que você tenha definido…
A minha pergunta é: existe alguma ocasião onde a palavra chave synchronized não pode ser usada junto com a declaração de um método?
abstractclassTeste{//isso não funciona....publicabstractsynchronizedvoidx();}
E
entanglement
Uma forma simples de você lembrar onde é que se pode usar “synchronized” na declaração de métodos é que ele é equivalente a usar synchronized (this) ou synchronized (EstaClasse.class) dependendo do tipo de método. Ou seja:
Como você pode ver, se o método é abstract, ou então é uma declaração de método em uma interface, não é possível o compilador substituir “synchronized” por “synchronized(this)”, por exemplo. O método deve sempre ser concreto para poder ser marcado com “synchronized”.
E
entanglement
Eu digo que é “mais ou menos equivalente” porque na verdade o javac não gera os bytecodes correspondentes a “synchronized (this)”. Em vez disso, ele marca o método como synchronized, e deixa a cargo do Just-In-Time Compiler (HotSpot no caso do Java da Sun) o trabalho de gerar código nativo (ou de efetuar a interpretação) de modo que fique equivalente a “synchronized (this)”.