Operacja CAS (Compare-And-Swap) to algorytm używany do zarządzania współbieżnością w programowaniu. W Javie znajduje swoje zastosowanie głównie w klasach, które są częścią pakietu java.util.concurrent. W tej lekcji przyjrzymy się bliżej, jak działają klasy wykorzystujące operacje CAS i zaimplementujemy kompleksowy przykład wykorzystujący te techniki.
Klasy Java używające CAS
Operacje CAS są szeroko stosowane w różnych klasach Java, takich jak AtomicInteger, AtomicLong, AtomicReference oraz w implementacjach lock-free struktur danych jak np. ConcurrentLinkedQueue. Wszystkie te klasy korzystają z natywnych metod z pakietu sun.misc.Unsafe, które zapewniają atomowe operacje na poziomie sprzętowym.
Przykład kodu: Implementacja prostego licznika
Poniższy kod demonstruje implementację prostego licznika przy użyciu klasy AtomicInteger, która wykorzystuje operacje CAS do bezpiecznego inkrementowania wartości w środowisku wielowątkowym.
import java.util.concurrent.atomic.AtomicInteger;
public class CASCounter {
// AtomicInteger zapewniający bezpieczeństwo współbieżności
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
// Początkowa wartość zmiennej lokalnej
int oldValue;
do {
// Aktualna wartość count
oldValue = count.get();
// Próba ustawienia nowej wartości, jeśli current jest równa oldValue
} while (!count.compareAndSet(oldValue, oldValue + 1));
// compareAndSet zwraca true, jeśli udało się zmienić wartość
}
public int getValue() {
// Zwraca aktualną wartość licznika
return count.get();
}
}
Komentarze do kodu
– AtomicInteger: Klasa AtomicInteger używa operacji CAS wewnętrznie do zapewnienia atomowości aktualizacji wartości.
– Metoda increment(): Wykonuje atomowe inkrementowanie wartości licznika. Pobiera bieżącą wartość, a następnie próbuje zaktualizować ją o 1, jeśli inny wątek nie dokonał zmiany w międzyczasie.
– Metoda getValue(): Zwraca aktualną wartość licznika, zapewniając przy tym bezpieczny dostęp do zmiennej w kontekście wielowątkowym.
Podsumowanie
Operacje CAS w Javie umożliwiają bezpieczne i efektywne zarządzanie stanem w aplikacjach wielowątkowych bez potrzeby blokowania. Dzięki temu programy mogą działać szybciej i efektywniej. Przykład pokazał, jak łatwo można implementować bezpieczne operacje współbieżne, korzystając z klasy AtomicInteger i metody compareAndSet.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.