Czym są blokady optymistyczne i pesymistyczne?
sobes.tech AI
Odpowiedź od AI
Optymistyczne i pesymistyczne blokady to podejścia do zarządzania równoległym dostępem do wspólnych danych w środowiskach konkurencyjnych (aplikacje wielowątkowe, bazy danych).
Pesymistyczna blokada:
Zakłada, że konflikty podczas dostępu do danych są prawdopodobne. Przed dostępem do zasobu, wątek lub transakcja go blokuje (w sposób wyłączny lub współdzielony). Inne wątki próbujące uzyskać dostęp będą czekać, aż blokada zostanie zwolniona.
- Zalety: Zapewnia integralność danych, jest prosta w implementacji przy niskiej konkurencji.
- Wady: Może prowadzić do blokad (oczekiwań), obniżać przepustowość przy dużej konkurencji (deadlocki).
- Przykłady: słowo kluczowe
synchronizedw Java, blokady na poziomie wierszy lub tabel w bazach danych.
// Przykład pesymistycznej blokady w Java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++; // blokada na obiekcie, tylko jeden wątek może wykonywać tę metodę jednocześnie
}
public synchronized int getCount() {
return count;
}
}
Optymistyczna blokada:
Zakłada, że konflikty podczas dostępu do danych są mało prawdopodobne. Dostęp do danych odbywa się bez blokad. Przed zapisaniem zmian sprawdzane jest, czy dane nie zostały zmienione przez inny wątek od czasu ich odczytu. Jeśli tak, operacja jest anulowana i zwykle powtarzana (retry).
- Zalety: Wysoka przepustowość przy niskiej konkurencji, brak problemów z deadlockami.
- Wady: Mogą wystąpić konflikty, które wymagają powtórzeń, co utrudnia logikę. Nie nadaje się do operacji długotrwałych lub z wysokim prawdopodobieństwem konfliktów.
- Przykłady: operacje Compare-And-Swap (CAS), zarządzanie wersjami w bazach danych (np. użycie kolumny wersji lub znacznika czasu).
// Przykład optymistycznej blokady z użyciem CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
// Próba atomowego zwiększenia
// Jeśli wartość zmieniła się między odczytem a aktualizacją, próba zostanie powtórzona
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
Porównanie:
| Cecha | Pesymistyczny blokada | Optymistyczny blokada |
|---|---|---|
| Założenie | Konflikty są prawdopodobne | Konflikty są mało prawdopodobne |
| Podejście | Blokada do momentu dostępu | Dostęp bez blokady, sprawdzanie przy zapisie |
| W środowiskach o wysokiej konkurencji | Może powodować blokady, obniżać przepustowość | Częste ponowne próby, obniżenie wydajności |
| W środowiskach o niskiej konkurencji | Może generować narzut | Wysoka przepustowość |
| Problem deadlock | Możliwy | Niemożliwy (z punktu widzenia równoczesnego dostępu do zasobów) |