Alternativa para um Hashtable ? [RESOLVIDO]

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 ?

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.

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.

[quote=entanglement]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.
[/quote]

Seria por ordem de inserção, isso que está pegando.

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).

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.

Na verdade eu estou usando ConcurrentHashMap.

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).

[quote=tchinfurinfu]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.[/quote]

Obrigadão meu camarada.
Implementei utilizando a LinkedHashMap. Aparentemente tudo redondo, agora é realizar testes de concorrência mais aprofundado.

E obrigado tb ao entanglement.