| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 12:13:10
|
fsfnit
Java Ninja
![[Avatar]](/images/avatar/83a703361336ec7c6f2efcd4f4a44206.jpg)
Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline
|
Fala ai galera,
é o seguinte:
Escolhi usar um hashtable pois é thread-safe. Porém ele não é ordenado. E isto agora passou a ser um requisito: Preciso obter os elementos de forma ordenada , e ao mesmo tempo a lista deve possuir mecanismo de controle de acesso às threads.
Alguma sugestão ?
This message was edited 1 time. Last update was at 22/07/2010 13:18:46
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 12:18:00
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Ordenada = em ordem alfabética ou em ordem de inserção?
Se for ordenada = ordem alfabética ou numérica, use um ConcurrentSkipListMap: http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/util/concurrent/ConcurrentSkipListMap.html
Se for ordenada = ordem de inserção, aí não sei (você poderia usar uma LinkedHashMap se quiser deixar ordenada pela ordem de inserção, mas o problema é que não há uma versão "concorrente" dessa estrutura de dados em java.util.concurrent.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 12:19:59
|
tchinfurinfu
Thread.start()
Membro desde: 14/04/2010 15:13:34
Mensagens: 40
Offline
|
Fala meu amigo,
Você pode utilizar a classe SortedMap.
E para tornar a instância Thread-safe, utilizar o método Collections.synchronizedSortedMap(SortedMap<K,V> m).
Depois me diga se funcionou.
Abraço.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 12:20:20
|
fsfnit
Java Ninja
![[Avatar]](/images/avatar/83a703361336ec7c6f2efcd4f4a44206.jpg)
Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline
|
Seria por ordem de inserção, isso que está pegando.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 12:21:54
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Além disso, java.util.Hashtable não é exatamente "thread-safe". O que ela é, na verdade, é sincronizada, mas não exatamente "thread-safe"; não se recomenda seu uso, exceto quando você quer ter código compatível com Java 1.1. Evite usar java.util.Hashtable em código novo (desde o tempo do Java 1.2 vale essa recomendação).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 12:24:19
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Como foi sugerido, pode-se usar o tal método Collections.synchronizedMap para converter uma LinkedHashMap em um Map que tem a mesma propriedade de LinkedHashMap (ou seja, seu iterador retorna os elementos por ordem de inserção) e tem acesso sincronizado ao mapa.
Se for suficiente, para você, que o acesso ao mapa seja sincronizado, está OK. Mas se você precisar de algo mais "performático", aí precisa dar uma estudada nas classes do pacote java.util.concurrent e ver qual delas pode ser usada no seu caso.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 12:25:05
|
fsfnit
Java Ninja
![[Avatar]](/images/avatar/83a703361336ec7c6f2efcd4f4a44206.jpg)
Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline
|
entanglement wrote:Além disso, java.util.Hashtable não é exatamente "thread-safe". O que ela é, na verdade, é sincronizada, mas não exatamente "thread-safe"; não se recomenda seu uso, exceto quando você quer ter código compatível com Java 1.1. Evite usar java.util.Hashtable em código novo (desde o tempo do Java 1.2 vale essa recomendação).
Na verdade eu estou usando ConcurrentHashMap.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 12:37:50
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Hum.. que pena. Não sei exatamente se é possível criar um LinkedConcurrentHashMap a partir de um CopyOnWriteArrayList e de um ConcurrentHashMap como foi feito com o LinkedHashMap (que é uma combinação de um LinkedList e um HashMap).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/07/2010 13:17:23
|
fsfnit
Java Ninja
![[Avatar]](/images/avatar/83a703361336ec7c6f2efcd4f4a44206.jpg)
Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline
|
tchinfurinfu wrote:Fala meu amigo,
Você pode utilizar a classe SortedMap.
E para tornar a instância Thread-safe, utilizar o método Collections.synchronizedSortedMap(SortedMap<K,V> m).
Depois me diga se funcionou.
Abraço.
Obrigadão meu camarada.
Implementei utilizando a LinkedHashMap. Aparentemente tudo redondo, agora é realizar testes de concorrência mais aprofundado.
E obrigado tb ao entanglement.
|
|
|
 |
|
|