Ce sunt blocajele optimiste și pesimiste?
sobes.tech AI
Răspuns de la AI
Blocările optimiste și pesimistice sunt abordări pentru gestionarea accesului paralel la datele comune în medii concurente (aplicații multi-thread, baze de date).
Blocarea pesimistă:
Presupune că conflictele la accesarea datelor sunt probabile. Înainte de a accesa o resursă, firul sau tranzacția o blochează (exclusiv sau partajat). Alți fire care încearcă să acceseze resursa vor aștepta până când blocarea este eliberată.
- Avantaje: Asigură integritatea datelor, este simplu de implementat în condiții de concurență scăzută.
- Dezavantaje: Poate duce la blocaje (așteptări), scăderea capacității de procesare în condiții de concurență ridicată (deadlock-uri).
- Exemple: cuvântul cheie
synchronizedîn Java, blocări la nivel de rând sau tabel în baze de date.
// Exemplu de blocare pesimistă în Java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++; // Blocare pe obiect, doar un fir poate executa această metodă simultan
}
public synchronized int getCount() {
return count;
}
}
Blocarea optimistă:
Presupune că conflictele la accesarea datelor sunt improbabile. Accesul la date se face fără blocări. Înainte de salvare, se verifică dacă datele nu au fost modificate de alt fir de la citirea lor. Dacă au fost, operația este anulată și de obicei se încearcă din nou (retry).
- Avantaje: Capacitate mare de procesare în medii cu concurență scăzută, fără probleme de deadlock.
- Dezavantaje: Pot apărea conflicte care necesită reîncercări, ceea ce complică logica. Nu este potrivit pentru operații lungi sau cu probabilitate mare de conflicte.
- Exemple: operații Compare-And-Swap (CAS), gestionarea versiunilor în baze de date (de exemplu, utilizarea unei coloane de versiune sau timestamp).
// Exemplu de blocare optimistă folosind CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
// Încercare de incrementare atomică
// Dacă valoarea s-a schimbat între citire și actualizare, încercarea se reia
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
Comparație:
| Caracteristică | Blocarea pesimistă | Blocarea optimistă |
|---|---|---|
| Presupunere | Conflictele sunt probabile | Conflictele sunt improbabile |
| Abordare | Blocare până la acces | Acces fără blocare, verificare la scriere |
| În medii cu concurență ridicată | Poate cauza blocaje, reduce capacitatea | Reîncercări frecvente, reducere performanță |
| În medii cu concurență scăzută | Poate crea overhead | Capacitate mare de procesare |
| Problema deadlock | Posibil | Imposibil (din perspectiva accesului concurent la resurse) |