Sobes.tech
Middle+

Ce este mecanismul CAS (Compare-And-Swap)?

sobes.tech AI

Răspuns de la AI

Mecanismul Compare-And-Swap (CAS) este o operație atomică de mașină utilizată pentru implementarea sincronizării fără blocare.

Principiul de funcționare:

  1. Citește valoarea curentă a celulei de memorie (expectedValue).
  2. Încearcă să scrie o nouă valoare (newValue) în această celulă doar dacă valoarea curentă corespunde cu expectedValue.
  3. Returnează o valoare booleană: true dacă scrierea a fost reușită (adică, a avut loc o potrivire), false în caz contrar.

În Java, CAS este implementat în clasele din pachetul java.util.concurrent.atomic, de exemplu, AtomicInteger, AtomicLong, AtomicReference.

Exemplu de utilizare a AtomicInteger:

// java
import java.util.concurrent.atomic.AtomicInteger;

public class CasExample {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        while (true) {
            int expectedValue = count.get(); // Citește valoarea curentă
            int newValue = expectedValue + 1;
            if (count.compareAndSet(expectedValue, newValue)) {
                // Dacă valoarea curentă nu s-a schimbat de la citire,
                // efectuează scrierea și iese din buclă
                break;
            }
            // Dacă valoarea s-a schimbat, încearcă din nou
        }
    }
}

Avantaje:

  • Non-blocant: firele nu se blochează reciproc, reducând costurile de schimbare a contextului, mai ales în cazul concurenței scăzute.
  • Evită problemele de deadlock.

Dezavantaje:

  • Problema ABA: dacă valoarea celulei se schimbă de la A la B și apoi înapoi la A, CAS va considera că nu au avut loc schimbări. Pentru a rezolva această problemă, se folosesc clase precum AtomicStampedReference sau AtomicMarkableReference.
  • Pot apărea un număr mare de încercări nereușite (spin loops) în cazul unei concurențe ridicate.