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