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