Чтобы избежать взаимоблокировок при разработке многопользовательских приложений, можно использовать следующие подходы:
- Игнорирование блокировок. 1 Это простое, но опасное решение: не блокировать ресурсы, когда с ними работает какой-то процесс. 1 В таком случае взаимоблокировок не возникает, и программа работает быстрее, потому что процессы могут обращаться к одним и тем же данным одновременно и не ждать. 1 Однако без блокировок нельзя обеспечить сохранность данных, поэтому игнорирование применять не рекомендуется. 1
- Ранжирование ресурсов. 1 В этом случае каждой блокировке процесса задаётся приоритет. 1 Процессы обязаны начинать с самых «больших» блокировок, а перед тем как обратиться к ним, освобождать все «меньшие». 1 Иногда это приводит к повтору действий, но взаимных блокировок при таком подходе не возникает. 1
- Проверка возможности блокировки. 1 В этом случае программа сама проверяет, можно ли получить доступ к ресурсам или это вызовет взаимную блокировку. 1 Например, в языке программирования Java для реализации этого способа есть интерфейс Lock — он подразумевает проверку перед блокированием. 1
- Разработка иерархии блокировок. 2 Между блокировками устанавливается отношение сравнения и вводится правило о запрете захвата «большей» блокировки в состоянии, когда уже захвачена «меньшая». 2
Считается, что лучший способ избежать взаимных блокировок — с самого начала проектировать систему так, чтобы подобной ситуации не могло возникнуть. 1 А если это невозможно, создать механизм выхода из взаимоблокировок, который не «ломал» бы программу. 1