У меня есть интересная проблема, связанная с прямыми прямыми потоками Java. Вот оно.Java Thread Live Lock
Есть четыре глобальных замков - L1, L2, L3, L4
Есть четыре потока - Т1, Т2, Т3, Т4
Т1 требует блокировки L1, L2, L3, Т2 требует блокировки L2 T3 необходимые блокировки L3, L4 T4 требует блокировки L1, L2
Таким образом, картина проблемы - любой из потоков может работать и приобретать замки в любом порядке. Если какой-либо из потоков обнаруживает, что блокировка, в которой она нуждается, недоступна, она освобождает все остальные блокировки, которые она ранее приобрела, ждет фиксированное время, прежде чем повторить попытку. Повторение цикла приводит к возникновению условия блокировки.
Таким образом, чтобы решить эту проблему, у меня есть два решения в виде
1) Пусть каждый нить ожидание случайного периода времени перед повтором.
OR,
2) Пусть каждый поток приобретает все замки в определенном порядке (даже если поток не требует всех замков)
Я не уверен, что это единственные два варианта доступен меня. Пожалуйста, порекомендуйте.
Действительно. (1) избегает латентности и (2) имеет экстремальный тупиковый потенциал, как показано Zim-Zam, если нити, которые не могут получить свои блокировки, освобождают те, которые уже были приобретены, и повторите попытку позже. –