- Startseite
- Skills
- Code-Review
- Nebenlaeufigkeits-Review
Nebenlaeufigkeits-Review
Nebenlaeufigen Code pruefen: Race Conditions, Deadlocks, Thread-Sicherheit und atomare Operationen.
Das Problem
Nebenlaeufigkeits-Bugs sind die schwierigste Klasse von Softwarefehlern. Sie treten intermittierend auf, verschwinden beim Debuggen und haengen von Timing ab, das nicht zuverlaessig reproduzierbar ist. Eine Race Condition in einem Zahlungssystem verarbeitet eine Belastung doppelt. Ein geteilter Cache ohne korrekte Sperrung liefert veraltete Daten. Ein Deadlock friert den Server um 3 Uhr morgens unter Spitzenlast ein. Diese Bugs ueberleben Tests, weil sie spezifisches Interleaving von Operationen erfordern.
Der Prompt
Pruefe den folgenden Code auf Nebenlaeufigkeitsprobleme. Handle als Distributed-Systems-Engineer, der Code unter gleichzeitigem Zugriff analysiert.
SPRACHE/RUNTIME: [z.B. Node.js (single-threaded + async), Go (Goroutines), Java (Threads)]
NEBENLAEUFIGKEITSMODELL: [async/await, Threads, Goroutines, Actors, Web Workers]
GETEILTE RESSOURCEN: [z.B. Datenbank, In-Memory-Cache, Dateisystem, externe API]
CODE:
[Code hier einfuegen]
Analysiere in diesen Nebenlaeufigkeits-Dimensionen:
1. **Race Conditions**
- Sind Read-Modify-Write-Sequenzen atomar?
- Koennen zwei Requests zwischen Pruefung und Aktion interleaven (TOCTOU)?
- Wird auf geteilte Variablen ohne Synchronisation zugegriffen?
2. **Deadlocks & Livelocks**
- Werden mehrere Locks in inkonsistenter Reihenfolge erworben?
- Koennen zirkulaere Wartebedingungen entstehen?
- Gibt es unendlich blockierende Operationen ohne Timeouts?
3. **Async-Korrektheit (JS/Python)**
- Werden Promises korrekt behandelt (keine unhandled Rejections)?
- Werden geteilte Closures ueber await-Grenzen hinweg mutiert?
- Koennen Events in unerwarteter Reihenfolge nach einem await feuern?
4. **Datenbank-Nebenlaeufigkeit**
- Werden Transaktionen fuer Multi-Step-Operationen verwendet?
- Ist das korrekte Isolation Level gesetzt?
- Werden Optimistic-Locking-Patterns (Versionsspalten) eingesetzt?
5. **Cache-Konsistenz**
- Koennen veraltete gecachte Daten nach Quellaenderung ausgeliefert werden?
- Gibt es ein Thundering-Herd-Problem?
- Sind Cache-Invalidierung und Datenaktualisierung atomar?
6. **Ressourcen-Lebenszyklus**
- Werden Verbindungen, Dateihandles und Locks in allen Pfaden freigegeben?
- Kann Ressourcenerschoepfung unter Burst-Traffic auftreten?
Fuer jedes Problem liefere:
- **Ort**: Datei und Zeile
- **Szenario**: Spezifisches Interleaving, das den Bug ausloest
- **Wahrscheinlichkeit**: Wahrscheinlich unter Last / Selten aber katastrophal / Theoretisch
- **Auswirkung**: Datenkorruption / Doppelverarbeitung / Deadlock / Veraltete Daten
- **Fix**: Nebenlaeufigkeitssicherer Ersatzcode
Beispielausgabe
## Nebenlaeufigkeits-Review: 3 Probleme gefunden
### Wahrscheinlich unter Last: Doppelbelastungs-Race-Condition
Ort: src/services/payment.ts:15
Code:
const balance = await getBalance(userId); // T1 liest 100€
if (balance >= amount) { // T1 prueft: 100 >= 80 ✓
await deductBalance(userId, amount); // T2 liest auch 100€, besteht auch
} // Ergebnis: 100€ - 80€ - 80€ = -60€
Fix (Optimistic Locking):
const result = await db.query(
"UPDATE balances SET amount = amount - $1 WHERE user_id = $2 AND amount >= $1 RETURNING amount",
[amount, userId]
);
if (result.rowCount === 0) throw new InsufficientBalance();
Wann verwenden
Bei Code ausfuehren, der gleichzeitige Anfragen (Webserver, Queue-Consumer, Hintergrundjobs), geteilten Zustand (Caches, Zaehler, Kontostands) oder Datenbanktransaktionen mit mehreren Tabellen verarbeitet. Unverzichtbar vor dem Deployment von Code, der Zahlungen verarbeitet oder Inventar verwaltet.
Profi-Tipps
- Nebenlaeufigkeitsmodell beschreiben — Node.js single-threaded async hat grundlegend andere Risiken als Java multi-threaded.
- Timing-Diagramm anfordern — “Zeichne ein ASCII-Timing-Diagramm, das zeigt, wie zwei gleichzeitige Requests interleaven koennen.”
- In Transaktionen denken — “Was ist das minimale Transaction Isolation Level, um diesen Bug zu verhindern?”
- Mental Stress-testen — “Was passiert, wenn 100 Nutzer diesen Endpunkt gleichzeitig treffen?”