Возможно, существует более производительное решение, но вот как я бы начал.
Я бы создал общий объект TreeAccess с lock(path)
и unlock(path)
методом.Этот метод должен был бы ввести синхронизированный блок, который будет зацикливаться, пока путь не будет доступен.На каждой итерации, если она недоступна, она будет проверять, доступен ли путь, а если нет, wait()
, пока какой-то другой поток не вызовет notifyAll()
.Если путь доступен, он будет продолжен, и когда он будет завершен, вызовите метод unlock (), который будет notifyAll()
.
. Прежде чем продолжить, необходимо сохранить заблокированный путь в некоторой структуре данных.И перед уведомлением вы должны удалить разблокированный путь из этой структуры данных.Чтобы проверить, доступен ли путь, вам необходимо выяснить, существует ли какой-либо путь в этой структуре данных, который равен или является предком пути, который вы хотите заблокировать.
public void lock(String path) {
synchronized (lock) {
while (!available(path)) {
lock.wait();
}
lockedPaths.add(path);
}
}
public void unlock(String path) {
synchronized (lock) {
lockedPaths.remove(path);
lock.notifAll();
}
}
private boolean available(String path) {
for (String lockedPath : lockedPaths) {
if (isParentOrEqual(lockedPath, path) { // this method is left as an exercise
return false;
}
}
return true;
}