所以我使用信号量时遇到了问题.编写一个代码,其中有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();
}
Run Code Online (Sandbox Code Playgroud)
当2个人试图进入彼此的房间时出现死锁.也出于某种原因,placesLeft计数不正确.
所以我该怎么做?
编辑:
忙于其他事情,重新回答这个问题.由于房间满了,问题不会发生,当来自room1的person1想要进入room2并且同时来自room2的person2想要进入room1时,会发生锁定.因为我明白它可能与同步有关吗?它们在发布之前就会卡住,因此不会调用release.据我所知,一个房间的准确和释放不能同时调用.所以基本上room1信号量释放不能被称为cuz同时调用accuire,对于room2也是如此?我是新手编码器,同步还不是那么清楚.从一个或另一个删除同步似乎不起作用(也是错误的).