Как избежать dead lock. Способ 3. Гибкий захват ресурсов

Как избежать dead lock. Способ 3. Гибкий захват ресурсов

Гибкий захват ресурсов подразумевает под собой две вещи:
  1. Перед захватом ресурса выполняется проверка, не заблокирован ли он уже (try lock). Если ресурс свободен, поток его сразу захватывает.
  2. Можно указать время ожидания ресурса, по истечению которого поток продолжит свою работу. Т.о. поток не будет висеть неопределённое количество времени, а сможет выполнить какую-нибудь полезную работу. Synchronized-блоки такой возможности не дают.
Гибкий захват хоть и гибкий, но он обязывает продумывать действия потока, которые будут выполнены в случае неудавшегося захвата ресурса: сделать ли следующую попытку захватить ресурс; вывести пользователю сообщение о недоступности ресурса; выполнить ещё какие-то вычисления, а потом снова попробовать захватить ресурс;…

В качестве итога: когда в системе возникают проблемы дедлоков, в первую очередь надо попробовать ввести правило захвата ресурсов. Тогда не нужно будет продумывать дополнительную логику в случае невозможности захватить ресурс. Если правило захвата ввести невозможно, а дополнительный монитор снижает производительность многопоточной системы, тогда нужно использовать гибкий захват.
Многопоточность