По сути, у вас есть проблема обедающего философа.
https://en.wikipedia.org/wiki/Dining_philosophers_problem
Ответ Овидиу Лупаса аналогичен решению Dijkstra Resource Heirarchy, но есть еще 3 решения, объясненные на вики-странице
Это решение арбитрапохоже.Если все объекты, с которыми вы работаете, наследуются от одного и того же типа, вы можете использовать статические переменные класса для реализации арбитров в классе объектов.
import java.util.concurrent.locks.Lock;
public void init()
{
Lock arbitrator = new Lock();
}
public void meth1()
{
arbitrator.lock();
synchronized (obj1) {
synchronized (obj2) {
arbitrator.unlock();
// Do Stuff
}
}
}
public void meth2()
{
arbitrator.lock();
synchronized (obj2) {
synchronized (obj1) {
arbitrator.unlock();
// Do Stuff
}
}
}
Решение Ченди / Мисры требует многопередачи сообщений, поэтому я не собираюсь это реализовывать, но в википедии есть довольно хорошее объяснение