Middle+
Mi az a CAS (Compare-And-Swap) mechanizmus?
sobes.tech MI
Válasz az MI-től
A Compare-And-Swap (CAS) mechanizmus egy atomikus gépi művelet, amit a zárolás nélküli szinkronizáció megvalósítására használnak.
Működési elv:
- Olvassa a memória cella aktuális értékét (expectedValue).
- Megpróbálja írni az új értéket (newValue) ebbe a cellába csak akkor, ha az aktuális érték megegyezik az expectedValue-val.
- Visszaad egy logikai értéket:
true, ha a írás sikeres volt (azaz egyezés volt),falsekülönben.
Java-ban a CAS a java.util.concurrent.atomic csomag osztályaiban van megvalósítva, például AtomicInteger, AtomicLong, AtomicReference.
Példa az AtomicInteger használatára:
// 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(); // Aktuális érték olvasása
int newValue = expectedValue + 1;
if (count.compareAndSet(expectedValue, newValue)) {
// Ha az aktuális érték nem változott az olvasás óta,
// végrehajtja az írást és kilép a ciklusból
break;
}
// Ha az érték változott, újra próbálja
}
}
}
Előnyök:
- Nem blokkoló: a szálak nem blokkolják egymást, csökkentve a kontextusváltási költségeket, különösen alacsony verseny esetén.
- Elkerüli a deadlock problémákat.
Hátrányok:
- ABA probléma: ha a cella értéke A-ról B-re változik, majd vissza A-ra, a CAS azt fogja hinni, hogy nem történt változás. Ennek megoldására olyan osztályokat használnak, mint az
AtomicStampedReferencevagy azAtomicMarkableReference. - Magas verseny esetén sok sikertelen próbálkozás (spin loop) fordulhat elő.