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
}
}