Existe algum método que não aceita a palavra chave "synchronized"?

3 respostas
T

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?

3 Respostas

V

sim… em métodos abstratos…
ex:

abstract class Teste {

//isso não funciona....
public abstract synchronized void x();

}
E

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:

classe EstaClasse {
...
synchronized void metodo1 () {
   ...
}
synchronized static void metodo2() {
   ...
}
...
}

é mais ou menos equivalente a isto aqui:

classe EstaClasse {
...
void metodo1 () {
    synchronized (this) {
      ...
    }
}
static void metodo2() {
    synchronized (EstaClasse.class) {
      ...
    }
}
...
}

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

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)”.

Criado 2 de fevereiro de 2010
Ultima resposta 2 de fev. de 2010
Respostas 3
Participantes 3