Тупик с семафором

Итак, у меня проблема с использованием семафора. Пишем код где 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? Я новичок в программировании и синхронизация пока не так понятна. Удаление синхронизации с того или иного не работает, (это также неправильно).

8
задан Jan Hrcek 9 October 2012 в 09:06
поделиться