Sobes.tech
Middle+

Em que casos deve usar atomic e em que casos synchronized?

sobes.tech IA

Resposta da IA

synchronized é usado para proteger um bloco de código ou método contra o acesso simultâneo de múltiplas threads a recursos partilhados, garantindo o acesso exclusivo.

As classes atomic (por exemplo, AtomicInteger, AtomicReference) fornecem operações atómicas sobre tipos primitivos e referências, que não requerem bloqueio explícito. Baseiam-se no mecanismo Compare-And-Swap (CAS) e são adequadas para cenários onde é necessária uma operação atómica sobre um valor individual sem bloqueio completo.

Use atomic para:

  • Operações atómicas sobre variáveis individuais (incremento, decremento, atualização).
  • Contadores e flags, cujo acesso é feito por múltiplas threads.
  • Cenários onde o desempenho é crítico e pode evitar os custos de bloqueio.

Use synchronized para:

  • Proteger estruturas de dados complexas e objetos contra alterações simultâneas.
  • Coordenar o acesso a múltiplas variáveis relacionadas.
  • Bloquear blocos de código ou métodos inteiros.

Exemplo de synchronized:

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

Exemplo de AtomicInteger:

import java.util.concurrent.atomic.AtomicInteger;

class AtomicCounter {
    private final AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet(); // Incremento atómico
    }

    public int getCount() {
        return count.get(); // Obtenção atómica do valor
    }
}