Цепочка блокировки возникает, когда работник заблокирован другим работником. A не может продолжаться из-за B. Цепочка может быть длиннее: A блокируется B, B блокируется C, C блокируется D.
Тупик - это когда цепочка замков образует петлю. A блокируется B, B C, C, A и цепь образовала петлю, прогресс невозможен.
Типичным способом предотвращения взаимных блокировок является использование иерархий блокировок: если блокировки всегда обнаруживаются каждым работником в одном и том же порядке, то взаимные блокировки невозможны, поскольку каждая блокировка происходит между рабочим, который удерживает блокировки, ранжированные X, и ожидает ранжированные ресурсы Y, где X> Y всегда. Цикл не может образоваться в этом случае, так как он потребует, чтобы хотя бы один рабочий пошел против иерархии, чтобы закрыть цикл. Такова теория, по крайней мере. В prcatice очень и очень сложно придумать реалистичные иерархии (и нет, адрес ресурса не работает).
Если невозможно избежать взаимоблокировок (например, систем баз данных), то решение состоит в том, чтобы иметь выделенные потоки, которые проверяют цепочки взаимоблокировок в поиске циклов и убивают одного из участников, чтобы освободить цикл.