Dúvida questão de Thread  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
Lintz_net
JavaBaby

Membro desde: 02/08/2006 15:27:06
Mensagens: 79
Offline

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.
[Email]
rocha
Virtual Machine Man
[Avatar]

Membro desde: 28/04/2003 10:23:56
Mensagens: 718
Localização: São José dos Campos e Poá - SP.
Offline

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().



seria o mesmo que vc tivesse feito:

This message was edited 1 time. Last update was at 30/10/2007 15:39:25


"As religiões formalistas tendem à fixação das crenças e à cristalização dos sentimentos; fossilizam a Verdade; desviam-se do serviço de Deus para o da Igreja; lutam entre si e entre os irmãos, em nome do amor, dando origem ao aparecimento das seitas e das divisões; estabelecem autoridades eclesiásticas pressivas; conduzem ao nascimento do falso estado mental aristocrático de povo eleito; mantêm ideias falsas e exageradas sobre a santidade; tornam-se rotineiras e petrificadas e acabam por venerar o passado, ignorando as necessidades do presente."

Rodrigo
http://www.rrochas.com.br
[Email] [WWW] [MSN]
CarlosEduardoDantas
GUJ Master
[Avatar]

Membro desde: 13/11/2006 15:26:38
Mensagens: 1089
Offline

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:



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

This message was edited 2 times. Last update was at 30/10/2007 15:54:34


'Nós somos o que repetidamente fazemos. Excelência, então, não é um ato, mas um hábito'.

Aristóteles.

carloseduardoxp
[MSN] [ICQ]
Lintz_net
JavaBaby

Membro desde: 02/08/2006 15:27:06
Mensagens: 79
Offline

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.
[Email]
Lintz_net
JavaBaby

Membro desde: 02/08/2006 15:27:06
Mensagens: 79
Offline

caduengenheiro wrote: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:



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.
[Email]
CarlosEduardoDantas
GUJ Master
[Avatar]

Membro desde: 13/11/2006 15:26:38
Mensagens: 1089
Offline

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

This message was edited 1 time. Last update was at 30/10/2007 16:29:13


'Nós somos o que repetidamente fazemos. Excelência, então, não é um ato, mas um hábito'.

Aristóteles.

carloseduardoxp
[MSN] [ICQ]
rocha
Virtual Machine Man
[Avatar]

Membro desde: 28/04/2003 10:23:56
Mensagens: 718
Localização: São José dos Campos e Poá - SP.
Offline

Lintz_net wrote: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:



mesmo!

"As religiões formalistas tendem à fixação das crenças e à cristalização dos sentimentos; fossilizam a Verdade; desviam-se do serviço de Deus para o da Igreja; lutam entre si e entre os irmãos, em nome do amor, dando origem ao aparecimento das seitas e das divisões; estabelecem autoridades eclesiásticas pressivas; conduzem ao nascimento do falso estado mental aristocrático de povo eleito; mantêm ideias falsas e exageradas sobre a santidade; tornam-se rotineiras e petrificadas e acabam por venerar o passado, ignorando as necessidades do presente."

Rodrigo
http://www.rrochas.com.br
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team