Dúvida em synchronized

3 respostas
T

Which three will compile and run without exception?

A) private synchronized Object o;

B) void go(){ synchronized() {} }

C) public synchronized void go(){}

D) private synchronized(this) void go(){}

E) void go(){ synchronized(Object.class){} }

F) void go(){ Object o = new Object(); synchronized(o){} }

As respostas corretas são C, E e F. Porém, na alternativa E, eu não entendi porque se pode usar o Object.class … Isso não serve apenas para quando o método é estático? O que Object.class diz exatamente?

Obrigado.

3 Respostas

V

o literal Object.class significa que vc esta adirindo o bloqueio não de uma instancia da classe Object mas sim da Classe Object, o bloqueio é feito por classe em vez de bloqueio por instancia

T

Ok. Mas, então, no caso da letra E o que isso significa? Significa que todos os OBJETOS que chamem o método go() vão ser sincronizados dentro do bloco synchronized(Object.class){} ???

ViniGodoy

Dentro do bloco sinchronized você pode colocar qualquer objeto. Object.class retorna um objeto do tipo Class que descreve a classe object. Como ele é um objeto comum, também pode ser usado para sincronização.

Não existe o conceito de “bloqueio de classe”. Os bloqueios sempre funcionam da mesma forma, e atuam sobre partes do código.

Seu bloco sinchronized procura por um monitor, que é um objeto. No caso de um método synchronized, você não terá o this, portanto, deverá procurar um monitor externo, geralmente, um outro objeto estático, ou de contexto único. Para o caso das classes, um bom candidato é o NomeDaClasse.this, tanto que ele é usado por padrão quando se faz sincronização sobre uma classe.

Criado 13 de janeiro de 2010
Ultima resposta 14 de jan. de 2010
Respostas 3
Participantes 3