Итак, у меня проблема с использованием семафора. Пишем код где 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
не выходит правильно.
Так что мне делать?
РЕДАКТИРОВАТЬ:
Был занят чем-то другим, оживляя вопрос. Проблема не возникает из-за того, что комнаты заполняются, блокировка происходит, когда человек 1 из комнаты 1 хочет войти в комнату 2, и в то же время человек 2 из комнаты 2 хочет войти в комнату 1. Как я понимаю, это как-то связано с синхронизацией? Они застревают перед релизом, поэтому релиз не вызывается. Насколько я понимаю, приобретаются одни номера, и релиз не может быть назван одновременно. Таким образом, в основном выпуск семафора room1 не может быть вызван, потому что в то же время вызывается accuire, то же самое для room2? Я новичок в программировании и синхронизация пока не так понятна. Удаление синхронизации с того или иного не работает, (это также неправильно).