Last Updated: June 6, 2026
A deadlock is what happens when two or more threads sit forever waiting for each other to release a lock. Nobody crashes. Nobody throws an exception. The threads just stop making progress, and the program keeps running with a piece of its work permanently frozen. This lesson covers what deadlock actually is, the four conditions that have to hold at once for it to happen, a runnable two-lock example, how to read a jstack thread dump to confirm one, the standard avoidance strategies, and two close relatives (livelock and starvation) that look similar but need different fixes.