| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2009 10:38:26
|
spranta
JavaEvangelist
![[Avatar]](/images/avatar/e3ca0449fa2ea7701a7ac53fb719c51a.png)
Membro desde: 19/01/2004 17:32:48
Mensagens: 305
Localização: Belo Horizonte
Offline
|
Pessoal, estou com um sistema que executa 10 threads simultaneamente, no entanto, existe um pedaço do código (método) que não pode ser executado por mais de um thread ao mesmo tempo e portanto eu tenho de sincronizar este método.
Eu usei o synchronized na assinatura do método, no entanto, isso não está sendo suficiente, visto que mais de uma thread está entrando no método ao mesmo tempo.
Alguém pode me dar uma dica de qual solução devo adotar?
|
"Não somos apenas ignorantes. Somos ignorantes sobre o quão ignorantes somos."
(Charles Darwin) |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2009 10:43:35
|
tinorberto
JavaEvangelist
![[Avatar]](/images/avatar/906b92b2e09a38a0dc5933b4943e87a0.jpg)
Membro desde: 29/10/2008 15:54:46
Mensagens: 344
Localização: Viçosa - Minas Gerais
Offline
|
Pelo que eu sei quando um um método e marcado synchronized, o sistema de execução Java garantirá que apenas uma thread de cada vez acesse tal método. Se outras threads tentarem fazer o mesmo, elas serão colocadas em espera até que a thread atual finalize seu trabalho e libere o método. Acho que vc esta enganado ..poste i seu codigo ... flw
|
Bacharel - Ciência da Computação
Universidade Federal de Viçosa
OCJP 6 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2009 11:32:26
|
abelgomes
Virtual Machine Man
![[Avatar]](/images/avatar/e14601b19b804b49c4022a1dd205554e.jpg)
Membro desde: 12/06/2008 17:08:23
Mensagens: 706
Localização: Manaus-AM
Offline
|
não senhores..o synchronized é no caso de duas threads chamarem o metodo ao mesmo tempo...ele garante que seja um depois da outra...ele dar um pequeno pause na thread 2 enqaunto a thread1 chama o metodo e depois libera pra 2....agora nesse seu caso :S...vou dar uma olhada aqui
|
...the only easy day was yesterday... |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2009 11:58:18
|
marcobiscaro2112
JWizard
Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline
|
synchronized: apenas uma Thread executa o trecho por vez. Necessariamente.
Pergunta: você está com problema em um laço for (ou Iterator), onde percorre algo tipo de Collection (como ArrayList, por exemplo)? Pode ocorrer (e muitas vezes ocorre) um ConcurrentModificationException quando se tenta adicionar ou remover objetos em uma Collection.
|
Marco Biscaro.
Seja livre!
Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?
Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2009 12:00:01
|
spranta
JavaEvangelist
![[Avatar]](/images/avatar/e3ca0449fa2ea7701a7ac53fb719c51a.png)
Membro desde: 19/01/2004 17:32:48
Mensagens: 305
Localização: Belo Horizonte
Offline
|
abelgomes wrote:não senhores..o synchronized é no caso de duas threads chamarem o metodo ao mesmo tempo...ele garante que seja um depois da outra...ele dar um pequeno pause na thread 2 enqaunto a thread1 chama o metodo e depois libera pra 2....agora nesse seu caso :S...vou dar uma olhada aqui
Mas o meu caso é justamente esse, eu quero que a 2ª thread espere a 1ª executar o metodo para depois executá-lo.
O método que quero sincronizar é um método do meu DAO e ele tem a seguinte assinatura:
Todas as threads utilizam o mesmo DAO que possui o método acima.
O DAO está sendo injetado na Thread via SPRING, mas acho que isso não tem nada a ver né.
Algum idéia?
|
"Não somos apenas ignorantes. Somos ignorantes sobre o quão ignorantes somos."
(Charles Darwin) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2009 12:04:00
|
marcobiscaro2112
JWizard
Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline
|
Você viu o que escrevi acima?
|
Marco Biscaro.
Seja livre!
Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?
Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2009 12:08:30
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
O abelgomes é o que mais se aproximou, mas ainda está errado.
Você tem um bloco synchronized (vou falar de blocos antes de falar dos métodos). Então você terá algum código mais ou menos assim:Quando a Thread chega no synchronized, ela tenta reservar o objeto abacaxi. Qualquer objeto pode servir como reserva.
Ao reservar o objeto abacaxi, a Thread se torna "dona" deste objeto, e só o larga quando sai do bloco synchronized.
Se a Thread A for dona de abacaxi (está sincronizando nele), e a Thread B tenta reservar o mesmo objeto abacaxi, ela vai ver que já foi reservado para outra Thread. Daí a Thread B espera que a Thread A largue o objeto abacaxi, para poder reservá-lo.
Se a Thread X for dona do objeto melancia e houver outras 50 Threads esperando para reservar o objeto melancia, quando a Thread X o largar, alguma das Threads que estão esperando por melancia vai ser sorteada com ele. Não há fila pela reserva, e sim sorteio.
Se a Thread A está sincronizando no objeto mamão e a Thread B no objeto beterraba, uma não influencia a outra. Estão sincronizando em objetos diferentes.
O synchronized no método é apenas um synthatic sugar:É o mesmo queObserve que o objeto usado para sincronizar é this. Desta forma, se a Thread A chama um método sincronizado da instância X e a Thread B chama um método sincronizado da instância Y, elas estarão sincronizando em objetos diferentes. Logo, ambos podem executar ao mesmo tempo.
Se a Thread A chama o método sincronizado x da instância H e a Thread B chama um outro método sincronizado y da mesma instância H, só uma executa de cada vez, pois estão sincronizando no mesmo objeto.
Para métodos estáticos, fica assim:É o mesmo queOu seja, sincroniza-se no objeto class correspondente.
Espero ter esclarecido.
This message was edited 1 time. Last update was at 20/01/2009 12:10:14
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2009 12:23:41
|
abelgomes
Virtual Machine Man
![[Avatar]](/images/avatar/e14601b19b804b49c4022a1dd205554e.jpg)
Membro desde: 12/06/2008 17:08:23
Mensagens: 706
Localização: Manaus-AM
Offline
|
perfect...
|
...the only easy day was yesterday... |
|
|
 |
|
|