Как только у программы есть несколько блокировок, тупик становится возможностью. Например, если одна нить пытается ввести Блокировку A и затем Блокировку B, в то время как одновременно другая нить пытается ввести Блокировку B и затем Блокировку A, для них возможно зайти в тупик, если каждый вводит блокировку, которой другой принадлежит прежде, чем попытаться ввести вторую блокировку.
С прагматической точки зрения тупики обычно предотвращены одним из двух способов. Первое (и лучше всего) способ предотвратить тупик, должен иметь небольшое количество достаточно блокировок в системе, что никогда не необходимо взять несколько блокировок за один раз. Если это невозможно, тупик может также быть предотвращен при наличии соглашения по заказу, в котором взяты блокировки. Тупики могут только произойти, если есть круглая цепочка нитей так, что, каждая нить в цепочке ждет на блокировке, уже полученной следующим в линии. Чтобы предотвратить это, каждой блокировке в системе назначают "уровень", и программа разработана так, чтобы нити всегда взяли блокировки только в строго порядке по убыванию уровнем. Этот протокол делает циклы, включающие блокировки, и поэтому зайдите в тупик, невозможный. Если эта стратегия не работает (не может найти ряд уровней), вероятно, что берущее блокировку поведение программы так зависимо от ввода, что невозможно гарантировать, что тупик не может произойти в каждом случае. Как правило, этот тип кода возвращается к перерывам или некоторой схеме обнаружения тупика.
Тупик является просто еще одной причиной сохранить число блокировок в системе маленьким. Если это не может быть сделано, анализ должен быть сделан определить, почему несколько блокировок должны быть взяты одновременно. Помните, взятие многократных блокировок только необходимо, когда код должен получить исключительный доступ к памяти, защищенной различными блокировками. Этот анализ обычно или приводит к тривиальной блокировке, приказывая, чтобы это избежало тупика или показало, что полное предотвращение тупика невозможно.