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