所以我在使用信号量时遇到了问题。编写代码,其中有 4 个房间和一些访客。每个房间对他们可以容纳的访客数量都有一定的上限。所以进入一个完整的房间会触发一个wait()。访客在进入另一个房间之前不能离开一个房间,所以他们总是在一个房间里。
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 时发生锁定。据我了解,这可能与同步有关吗?它们在释放之前被卡住,因此不会调用释放。据我了解,一个房间的累积和释放不能同时被调用。所以基本上不能在调用 accuire 的同时调用 room1 信号量释放,对于 room2 也一样?我是新手编码器,同步还不是很清楚。从一个或另一个中删除同步似乎不起作用(也是错误的)。