Middle
Que coleções thread-safe conheces em Java?
sobes.tech IA
Resposta da IA
Na Java Collections Framework, existem coleções seguras para threads, implementadas de duas formas principais:
-
Envelopes sincronizados (Synchronized Wrappers):
- Envolvem coleções normais não seguras para threads (por exemplo,
ArrayList,HashMap,HashSet). - Todos os métodos da coleção são sincronizados.
- Exemplo de obtenção de coleções sincronizadas:
// Obter uma lista sincronizada List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>()); // Obter um conjunto sincronizado Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>()); // Obter um mapa sincronizado Map<String, String> synchronizedMap = Collections.synchronizedMap(new HashMap<>()); - Desvantagem: Baixo desempenho em altos níveis de paralelismo, pois o bloqueio ocorre em toda a coleção.
- Envolvem coleções normais não seguras para threads (por exemplo,
-
Coleções do pacote
java.util.concurrent:- Projetadas especificamente para trabalhar em ambientes multithread.
- Alcançam segurança para threads através de diversos mecanismos (por exemplo, bloqueio granular, operações CAS).
- Oferecem melhor desempenho em operações paralelas em comparação com os wrappers sincronizados.
- Exemplos principais:
ConcurrentHashMap: Implementação thread-safe deMap, que fornece alta capacidade de processamento para operações de leitura e escrita.CopyOnWriteArrayList: Lista que, ao ser modificada, cria uma nova cópia do array subjacente. Adequada para coleções com operações de leitura frequentes e operações de escrita raras.CopyOnWriteArraySet: Semelhante aCopyOnWriteArrayList, mas para conjuntos.ConcurrentLinkedQueue: Implementação thread-safe, sem bloqueio, deQueue.ConcurrentLinkedDeque: Implementação thread-safe, sem bloqueio, deDeque.ConcurrentSkipListMap: Implementação thread-safe, escalável, deSortedMap.ConcurrentSkipListSet: Implementação thread-safe, escalável, deSortedSet.- Filas bloqueantes (
BlockingQueue,BlockingDeque) - por exemplo,ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue,DelayQueue,SynchronousQueue,LinkedTransferQueue. Usadas para coordenar produtores e consumidores.
A escolha entre wrappers sincronizados e coleções de java.util.concurrent depende dos requisitos específicos de desempenho e do contexto de uso em ambientes multithread (frequência de operações de leitura/escrita, nível de paralelismo). Na maioria das aplicações modernas multithread, é preferível usar coleções de java.util.concurrent.