Was sind optimistische und pessimistische Sperren?
sobes.tech KI
Antwort von AI
Optimistische und pessimistische Sperren sind Ansätze zur Verwaltung des parallelen Zugriffs auf gemeinsame Daten in konkurrierenden Umgebungen (Multithread-Anwendungen, Datenbanken).
Pessimistische Sperrung:
Geht davon aus, dass Konflikte beim Zugriff auf Daten wahrscheinlich sind. Bevor auf eine Ressource zugegriffen wird, sperrt der Thread oder die Transaktion sie (exklusiv oder gemeinsam). Andere Threads, die versuchen, darauf zuzugreifen, warten, bis die Sperre aufgehoben wird.
- Vorteile: Gewährleistet die Integrität der Daten, ist einfach in der Implementierung bei geringer Konkurrenz.
- Nachteile: Kann zu Sperrungen (Warten) führen, die Durchsatzrate bei hoher Konkurrenz verringern (Deadlocks).
- Beispiele: das Schlüsselwort
synchronizedin Java, Sperren auf Zeilen- oder Tabelleneebene in Datenbanken.
// Beispiel für pessimistische Sperrung in Java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++; // Sperre auf dem Objekt, nur ein Thread kann diese Methode gleichzeitig ausführen
}
public synchronized int getCount() {
return count;
}
}
Optimistische Sperrung:
Geht davon aus, dass Konflikte beim Zugriff auf Daten unwahrscheinlich sind. Der Zugriff erfolgt ohne Sperren. Vor dem Speichern wird geprüft, ob die Daten seit dem Lesen durch einen anderen Thread geändert wurden. Falls ja, wird die Operation abgebrochen und meist wiederholt (Retry).
- Vorteile: Hohe Durchsatzrate bei niedriger Konkurrenz, keine Probleme mit Deadlocks.
- Nachteile: Konflikte können auftreten, die erneute Versuche erfordern, was die Logik verkompliziert. Nicht geeignet für lang laufende Operationen oder bei hoher Konfliktwahrscheinlichkeit.
- Beispiele: Compare-And-Swap (CAS)-Operationen, Versionsverwaltung in Datenbanken (z.B. Verwendung einer Versionsspalte oder Zeitstempel).
// Beispiel für optimistische Sperrung mit CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
// Versuch, atomar zu erhöhen
// Wenn sich der Wert zwischen Lesen und Aktualisierung ändert, wird der Versuch wiederholt
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
Vergleich:
| Merkmal | Pessimistische Sperrung | Optimistische Sperrung |
|---|---|---|
| Annahme | Konflikte sind wahrscheinlich | Konflikte sind unwahrscheinlich |
| Ansatz | Sperre bis zum Zugriff | Zugriff ohne Sperre, Überprüfung beim Schreiben |
| Bei hoher Konkurrenz | Kann Sperren verursachen, Durchsatz verringern | Häufige Neustarts, Leistung verringern |
| Bei niedriger Konkurrenz | Kann Overhead erzeugen | Hohe Verarbeitungskapazität |
| Deadlock-Problem | Möglich | Unmöglich (aus Sicht des gleichzeitigen Zugriffs auf Ressourcen) |