| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 12:40:30
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
ae pessoal o codigo abaixo tanto faz sincronizado como nao.. ele imprime a mesma coisa nao entendi entao a diferença e o uso de bloquear usando essa sintaxe...
|
Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 12:46:44
|
nbluis
GUJ Master
![[Avatar]](/images/avatar/f0682320ccbbb1f1fb1e795de5e5639a.jpg)
Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline
|
Tente fazer um loop de 1000.
|
Luis Eduardo Bohrer
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 12:48:35
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Você tem duas threads, usando dois objetos diferentes.
Nesse caso, não há diferença em usar ou não sincronização. A sincronização só é necessária quando duas threads usam o mesmo objeto.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 12:53:08
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
e como resolvia esse problema ai? para que as duas thread possa referenciar ao mesmo objeto?
O que posso sincronizar?
- metodos
- variaveis
- class
- instancia da class
eu marcaria metodos e class ta certo?
|
Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 12:53:52
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Experimente rodar com esse código:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 13:11:15
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
somente uma thread foi executada...
non
num 0 Thread-0
num 1 Thread-0
resultado foi esse..
acabei de fazer esse para ver se entendo...
ta certo?
|
Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 13:35:48
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Você pode sincronizar trechos de código. A "sincronização de método" é uma forma prática de sincronizar o trecho de código de um método inteiro, de uma só vez, usando como objeto de sincronização o this.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 13:38:51
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
No código que eu fiz o resultado foi:
non
num 0 Thread-0
non
num 1 Thread-0
num 0 Thread-1
num 1 Thread-1
Note que, como o bloco é sincronizado, a thread 0 usa a impressão do número e valor completamente, antes que a thread 1 possa iniciar.
Apenas o non da thread 1 aparece "no meio" da thread 0, isso porque a impressão da palavra non não está num bloco sincronizado. Logo, ambas as threads puderam acessa-lo.
Retirando a sincronização obtive:
non
num 0 Thread-0
non
num 0 Thread-1
num 1 Thread-0
num 1 Thread-1
Veja como agora a execução ficou totalmente misturada.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 13:39:10
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
infelizmente nao conseguir a saida.. fiz ate um codigo mais simples mais nao entendi..
quando tiro a sincronizacao o resultado eh o mesmo..
|
Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 13:41:11
|
nbluis
GUJ Master
![[Avatar]](/images/avatar/f0682320ccbbb1f1fb1e795de5e5639a.jpg)
Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline
|
cara, faz um loop maior.....
|
Luis Eduardo Bohrer
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 13:46:32
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
eh parece que agora entendi
isso eh uma tremenda viajem.. rpz.. coisa de louco Thread...
|
Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 13:47:28
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Não adianta fazer um loop maior, embora certamente algumas impressões a mais ajudem.
Novamente, no caso da classe bloco, você criou 2 objetos distintos, e cada thread vai acessar seu próprio objeto. Não haverá diferença entre sincronizar ou não.
No caso da classe que eu fiz, o objeto Writer é compartilhado pelas duas threads.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 13:54:23
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
ViniGodoy wrote:No código que eu fiz o resultado foi:
non
num 0 Thread-0
non
num 1 Thread-0
num 0 Thread-1
num 1 Thread-1
Note que, como o bloco é sincronizado, a thread 0 usa a impressão do número e valor completamente, antes que a thread 1 possa iniciar.
Apenas o non da thread 1 aparece "no meio" da thread 0, isso porque a impressão da palavra non não está num bloco sincronizado. Logo, ambas as threads puderam acessa-lo.
Retirando a sincronização obtive:
non
num 0 Thread-0
non
num 0 Thread-1
num 1 Thread-0
num 1 Thread-1
Veja como agora a execução ficou totalmente misturada.
po vinny saquei valeu.. rpz.. isso eh uma noia viu? ave-maria... agora o codigo abaixo eh valido quando tenho extends Thread? posso dizer que ta acessando o mesmo objeto?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 14:01:13
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Sua execução pode ser descrita assim:
1. A thread t entra no método forca;
2. A thread t1 entra no método forca;
3. A thread t requisita a sincronização na chave this (t). E consegue, pois a chave t está livre.
4. A thread t1 requisita a sincronização na chave this (t1). E consegue, pois a chave t1 está livre (são objetos diferentes);
5. A thread t executa o primeiro loop do for;
6. A thread t1 executa o primeiro loop do for;
7. A thread t executa o segundo loop do for;
8. A thread t1 executa o segundo loop do for;
9. A thread t1 executa o terceiro loop do for;
10. A thread t executa o terceiro loop do for;
11. A thread t finaliza e libera a chave t;
12. A thread t1 finaliza e libera a chave t1;
Note que, como você tem dois objetos, também tem 2 chaves de sincronização. Por isso, não interessa rodar ou não com código sincronizado.
No caso do método Write e da minha classe, acontece o seguinte:
1. A thread t1 inicia;
2. A thread t2 inicia;
3. A thread t1 imprime non;
4. A thread t1 requisita a sincronização do this (no caso, o Writer w);
5. A thread t2 imprime non;
6. A thread t2 requisita a sincronização do this (no caso, o Writer w), mas não consegue, pois está em uso por t1. Ela então dorme e espera;
7. A thread t1 executa a primeiro loop do for;
8. A thread t1 executa a segundo loop do for;
9. A thread t1 executa a terceiro loop do for;
10. A thread t1 finaliza a execução liberando a chave w;
11. A thread t2 acorda, pega a chave this (w) e executa a primeiro loop do for;
12. A thread t2 executa a segundo loop do for;
13. A thread t2 executa a terceiro loop do for;
14. A thread t2 finaliza e libera a chave w;
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2007 14:06:07
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Se ambas as threads tiverem apontando uma referência apontando para o mesmo objeto, sim.
No caso, das minhas threads:
t1.writer == t2.writer
|
|
|
 |
|
|