Dúvida a respeito do lock dos objectos

Olá pessoal,

Estou lendo o cap. 9 do livro da Kathy, e cheguei na parte aonde fala sobre o lock. Minha dúvida é quando uma thread obtem o lock da classe, ela obtem o lock somente para o método synchronized que ela está executando ou para qualquer outro método synchonized da classe? Em outras palavras, é possível duas threads acessarem dois métodos synchronized distintos (que não tenham relação) da mesma classe? Obrigado!

Não é possível. Para executar métodos marcados como synchronized a thread precisa obter o lock do objeto. Esse lock é único, de forma que quando uma thread adquiriu este lock, qualquer outra thread que tentar utilizar o mesmo lock deve esperar que o mesmo seja liberado, então enquanto por exemplo uma thread está executando um método ou bloco synchronized, a segunda thread tem que esperar que a primeira libere o lock, seja pelo término da execução do método, por um wait chamado dentro do bloco ou método ou um erro de execução (neste caso o lock é liberado automaticamente também).
O fato de uma thread adquirir o lock de um objeto, no entanto, não impede que outras threads executem métodos na mesma instância que não fazem utilização do lock.
Outra coisa que é importante é que o lock padrão imposto pela palavra reservada synchronized é reentrante, ou seja, a thread que possui o lock pode chamar outros métodos sincronizados da mesma instância à partir do método sincronizado original chamado, pois a jvm irá detectar que a thread chamando outro método sincronizado é a mesma que possui o lock atual.

Olá estou com dúvida também , vc disse que o lock era no objeto, então se forem duas threads para o mesmo objeto mas em métodos diferentes marcados como synchronized, a primeira thread que alcançar um dos métodos bloqueia-o e também bloqueia a entrada ao outro método? foi isso que entendi .

ex:
class teste extends thread{

public static void main(String args[]){
t1 = new Thread();
t2 = new Thread();
t1.start();
t2.start();
}
synchronized void metodo1(){}

synchronized void metodo2(){}

public void run(){
metodo1();
metodo2();
}

}

a thread t1 vai executar o run() q chama o metodo1() , neste momento a thread t2 nao poderá chamar o metodo1 nem o metodo2, é isso mesmo?

agora sim resolvi eu mesmo a minha dúvida era exatamente como vc falou o thread t2 só entra em execução quando a t1 termina os dois metodos synchronized… valeuska