Dúvida questão de Thread

6 respostas
L

Pessoal, preciso de um help de vocês…estou com dúvida no seguinte código(esta questão eu retirei do livro da Kathy Sierra(pagina 419 - questão 2):

public class TestaThread extends Thread{

private String name;

public TestaThread(String name){
	this.name =  name;
}

public static void main(String[] args) {
	
	new TestaThread("X").start();
	new TestaThread("Y").start();
			
}

public void write(){
	System.out.print(name);
	System.out.print(name);
}

public void run(){
	synchronized (TestaThread.class) {
		write();
	}
}

}

Como garantir que a saída seja XXYY ou YYXX?

Respostas:

E) public void run(){

synchronized(TestaThread.class){

write();

}

}
F) public void run(){

synchronized(System.out){

write();

}

}

=> eu não entendi pq o item E, usando synchronized(TestaThread.class), eu garanto que a saída será XXYY ou YYXX, pois, quando eu li sobre sincronização e bloqueios no livro, eu li que synchronized(Myclass.class) é usado para proteger métodos static, ou seja, métodos de classe.E o método em questão que está sendo protegido é o método run()…

Obrigado.

6 Respostas

rocha

Lintz

O que vc está sincronizando não é o método run() e sim um bloco dentro do método que executa o método write().

synchronized(System.out){
write();
}

seria o mesmo que vc tivesse feito:

public synchronized void write(){
System.out.print(name);
System.out.print(name);
}
CarlosEduardoDantas

o problema é o seguinte…

eles querem que a saída seja XXYY ou YYXX, então as duas threads não poderão executar o método write() simultaneamente. Porém, vemos que existem 2 objetos distintos de thread criados, no caso new TestaThread(“X”) e new TestaThread(“Y”), ou seja, não são 2 threads apontando para o mesmo objeto. Como são 2 objetos distintos, um não bloqueia o outro, a não ser que:

1 - bloqueando a classe toda, no caso TestaThread.class
2 - bloqueando o metodo que vai ser usado para apresentar os dados, no caso System.out

a teoria que voce leu de bloqueio de metodos estaticos está correta, porém neste caso, estamos sincronizando toda a classe.

detalhe:

public synchronized void write(){  
  System.out.print(name);  
  System.out.print(name);  
}

não funcionaria, porque nesse caso, cada objeto tem sua instancia especifica de write(), tendo como consequencia que um nao bloquearia o outro.

L

Olá Rocha, valeu pela ajuda…

mas a minha dúvida é no item “E”

E) public void run(){

synchronized(TestaThread.class){

write();

}

}

E não no código:

synchronized(System.out){

write();

}

Obriogado.

L

caduengenheiro:
o problema é o seguinte…

eles querem que a saída seja XXYY ou YYXX, então as duas threads não poderão executar o método write() simultaneamente. Porém, vemos que existem 2 objetos distintos de thread criados, no caso new TestaThread(“X”) e new TestaThread(“Y”), ou seja, não são 2 threads apontando para o mesmo objeto. Como são 2 objetos distintos, um não bloqueia o outro, a não ser que:

1 - bloqueando a classe toda, no caso TestaThread.class
2 - bloqueando o metodo que vai ser usado para apresentar os dados, no caso System.out

a teoria que voce leu de bloqueio de metodos estaticos está correta, porém neste caso, estamos sincronizando toda a classe.

detalhe:

public synchronized void write(){  
  System.out.print(name);  
  System.out.print(name);  
}

não funcionaria, porque nesse caso, cada objeto tem sua instancia especifica de write(), tendo como consequencia que um nao bloquearia o outro.

caduengenheiro,

Eu ainda estou com a seguinte dúvida:

Quando eu li sobre sincronização e bloqueios no livro, eu li que synchronized(Myclass.class) é usado para proteger métodos static(pag. 404), ou seja, métodos de classe.E o método em questão que está sendo protegido é o método run() que não é de classe, obviamente…

“estamos sincronizando toda a classe.” => concordo, mas no meu ponto de vista, não garante que os métodos das duas thread(objeto e não classe) estão sincronizados, visto que a tentativa não foi em um método static(de classe).

obrigado.

CarlosEduardoDantas

olhe esse link:

http://www.guj.com.br/posts/list/57761.java

olhe especialmente o penultimo post (ViniGodoy)

qto ao livro, vc tem razao… nao esta mtu claro… acho que a explicacao do ViniGodoy está mais clara… apesar de mais curta :slight_smile:

rocha

Lintz_net:
Olá Rocha, valeu pela ajuda…

mas a minha dúvida é no item “E”

E) public void run(){

synchronized(TestaThread.class){

write();

}

}

E não no código:

synchronized(System.out){

write();

}

Obriogado.

Sim eu que confundi na hora da cópia o que eu disse é para:

public void run(){ synchronized(TestaThread.class){ write(); } }

mesmo!

Criado 30 de outubro de 2007
Ultima resposta 30 de out. de 2007
Respostas 6
Participantes 3