У меня проблема с использованием семафора. Написание кода, где 4 комнаты и некоторые посетители. В каждом номере есть определенная кепка для количества посетителей, которые они могут держать. Таким образом, вход в полную комнату вызовет ожидание(). Посетители не должны покидать комнату, прежде чем они смогут войти в другую, поэтому они всегда находятся в комнате.Семафорский тупик
public class Semaphore {
private int placesLeft;
public Semaphore(int placesInRoom) {
this.placesLeft = placesInRoom;
}
public synchronized void acquire(Visitor visitor) {
Semaphore sem = visitor.getRoom().getSemaphore();
try {
while (placesLeft <= 0) {
this.wait();
}
} catch (InterruptedException e) {}
sem.release();
placesLeft--;
}
public synchronized void release() {
placesLeft++;
this.notifyAll();
}
Тупик появляется, когда 2 человека пытаются войти в комнаты друг друга. Также по какой-то причине счет placesLeft
не подходит.
Итак, что мне делать?
EDIT:
были заняты чем-то другим, возрождая вопрос. Проблема не возникает из-за того, что комнаты заполняются, замок возникает, когда человек1 из комнаты 1 хочет войти в комнату2 и то же время человек2 из комнаты2 хочет войти в комнату1. Как я понимаю, что-то делать с синхронизацией? Они застревают до выпуска, поэтому релиз не вызывается. Поскольку я понимаю, что одна комната обвиняет и освобождает, нельзя назвать то же самое время. Так что основной выпуск семафора номер1 нельзя назвать cuz, в то же время вызывается accuire, то же самое для room2? Я новичок-кодер и синхронизация еще не совсем понятны. Удаление синхронизаций с того или другого не работает (также неверно).
Замыкание является логическим результатом, если обе комнаты полны. –
Ваш «<= 0» является симптомом ошибки.Значение никогда не должно быть ниже 0. Так что «==» должно делать. Почему вы передаете _room_ в приобретать()? –
Если двум посетителям разрешено менять комнаты, или это тупик, предпочтительный результат в этом случае? –