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?
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
TiagoTC
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.