Middle+
In quali casi si dovrebbe usare atomic e in quali synchronized?
sobes.tech AI
Risposta dell'AI
synchronized viene utilizzato per proteggere un blocco di codice o un metodo dall'accesso simultaneo di più thread alle risorse condivise, garantendo l'accesso esclusivo.
Le classi atomic (ad esempio, AtomicInteger, AtomicReference) forniscono operazioni atomiche su tipi primitivi e riferimenti, che non richiedono blocchi espliciti. Si basano sul meccanismo Compare-And-Swap (CAS) e sono adatte per scenari in cui è necessaria un'operazione atomica su un singolo valore senza blocco completo.
Usa atomic per:
- Operazioni atomiche su variabili singole (incremento, decremento, aggiornamento).
- Contatori e flag, a cui si accede da più thread.
- Scenari in cui le prestazioni sono critiche e si può evitare il costo dei blocchi.
Usa synchronized per:
- Proteggere strutture dati complesse e oggetti da modifiche simultanee.
- Coordinare l'accesso a più variabili correlate.
- Bloccare blocchi di codice o metodi interi.
Esempio di synchronized:
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
Esempio di AtomicInteger:
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
private final AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // Incremento atomico
}
public int getCount() {
return count.get(); // Ottieni valore atomico
}
}