Sobes.tech
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:

  1. 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.
  2. 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 de Map, 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 a CopyOnWriteArrayList, mas para conjuntos.
      • ConcurrentLinkedQueue: Implementação thread-safe, sem bloqueio, de Queue.
      • ConcurrentLinkedDeque: Implementação thread-safe, sem bloqueio, de Deque.
      • ConcurrentSkipListMap: Implementação thread-safe, escalável, de SortedMap.
      • ConcurrentSkipListSet: Implementação thread-safe, escalável, de SortedSet.
      • 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.