| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/10/2007 15:32:59
|
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.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/10/2007 15:39:02
|
rocha
Virtual Machine Man
![[Avatar]](/images/avatar/0b8aff0438617c055eb55f0ba5d226fa.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/10/2007 15:50:58
|
CarlosEduardoDantas
GUJ Master
![[Avatar]](/images/avatar/dc33e31c39c141adff52d67a0718b867.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/10/2007 15:53:59
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/10/2007 16:08:46
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/10/2007 16:27:07
|
CarlosEduardoDantas
GUJ Master
![[Avatar]](/images/avatar/dc33e31c39c141adff52d67a0718b867.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/10/2007 16:47:10
|
rocha
Virtual Machine Man
![[Avatar]](/images/avatar/0b8aff0438617c055eb55f0ba5d226fa.jpg)
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 |
|
|
 |
|
|