Dúvida a respeito do lock dos objectos

3 respostas
A

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!

3 Respostas

R

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.

A

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?

A

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

Criado 30 de outubro de 2012
Ultima resposta 31 de out. de 2012
Respostas 3
Participantes 3