Sobes.tech
Middle+

Čo je mechanizmus CAS (Compare-And-Swap)?

sobes.tech AI

Odpoveď od AI

Mechanizmus Compare-And-Swap (CAS) je atómová operácia stroja, ktorá sa používa na implementáciu nek blokujúcej synchronizácie.

Princíp fungovania:

  1. Číta aktuálnu hodnotu pamäťovej bunky (expectedValue).
  2. Pokúša sa zapísať novú hodnotu (newValue) do tejto bunky len ak aktuálna hodnota zodpovedá expectedValue.
  3. Vráti logickú hodnotu: true, ak zápis bol úspešný (t.j. došlo k zhode), false inak.

V jazyku Java je CAS implementovaný v triedach z balíčka java.util.concurrent.atomic, napríklad AtomicInteger, AtomicLong, AtomicReference.

Príklad použitia 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(); // Čítame aktuálnu hodnotu
            int newValue = expectedValue + 1;
            if (count.compareAndSet(expectedValue, newValue)) {
                // Ak sa aktuálna hodnota od posledného čítania nezmenila,
                // vykoná zápis a opustí slučku
                break;
            }
            // Ak sa hodnota zmenila, skúsiť znova
        }
    }
}

Výhody:

  • Nek blokujúci: vlákna sa navzájom nezablokujú, čo znižuje náklady na prepínanie kontextov, najmä pri nízkej konkurencii.
  • Vyhýba sa problémom s deadlockom.

Nevýhody:

  • ABA problém: ak sa hodnota bunky zmení z A na B a potom späť na A, CAS si myslí, že nedošlo ku zmene. Tento problém riešia triedy ako AtomicStampedReference alebo AtomicMarkableReference.
  • Pri vysokej konkurencii môže dôjsť k veľkému počtu neúspešných pokusov (spin loops).