
Livelock
Livelock looks healthy at first because threads are moving, retries are happening, and metrics show activity. The problem is that useful work never completes because every participant keeps reacting to the others. Unlike deadlock, the system is not stuck. It is busy in a loop of politeness, retries, or conflict handling.
Minimal Example
while (true) {
const acquired = tryLock(resourceId);
if (acquired) break;
await sleep(randomBetween(10, 50));
refreshLocalState();
} What It Solves
- Explains why a system can show high utilization but low completed work.
- Highlights the need for symmetry breaking under repeated contention.
- Connects retry design directly to throughput, not just correctness.
Failure Modes
- Using immediate retries with no jitter so workers collide again and again.
- Having all participants follow identical conflict-resolution logic with no tie breaker.
- Measuring attempts and queue depth without measuring completed work per unit time.
Production Checklist
- Add random backoff, priority, or ownership rules to break symmetry.
- Instrument success rate and time-to-completion, not just retry count.
- Escalate to fail-fast or queueing when contention passes a clear threshold.
Closing
Livelock is what happens when conflict handling has no progress guarantee. If everyone keeps being polite, nobody gets through the door.









