sincronizacao duvida  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
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/
[WWW]
nbluis
GUJ Master
[Avatar]

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.
[WWW]
ViniGodoy
Moderador
[Avatar]

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.
[WWW]
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/
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Experimente rodar com esse código:
[WWW]
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/
[WWW]
ViniGodoy
Moderador
[Avatar]

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.
[WWW]
ViniGodoy
Moderador
[Avatar]

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.
[WWW]
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/
[WWW]
nbluis
GUJ Master
[Avatar]

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.
[WWW]
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/
[WWW]
ViniGodoy
Moderador
[Avatar]

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.
[WWW]
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?

[WWW]
ViniGodoy
Moderador
[Avatar]

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;


[WWW]
ViniGodoy
Moderador
[Avatar]

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
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team