所以我有一个使用信号量的问题。 写一个代码,其中有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();
}
当两个人试图进入彼此的房间时出现死锁。 也出于某种原因,placesLeft
计数是不正确的。
那我该怎么办?
编辑:
一直忙于别的事情,恢复的问题。 这个问题并不是因为房间满了而发生的,当房间1中的人1想要进入房间2并且来自房间2的人2想要进入房间1时发生锁定。据我了解,它可能与同步处理有关?它们在发布之前会卡住,因此不会调用发布。据我所知,一个房间的精确和发布不能称为同一时间。所以基本上room1信号量的释放不能称为cuz,同样的时间被称为精灵,同样的room2?我是新手编码器,同步还不太清楚。 从一个或另一个删除同步似乎没有工作(也prolly错误)。
如果两个房间都已满,死锁是合乎逻辑的结果。 – 2012-04-15 23:02:39
您的“<= 0”是错误的症状。值不应该低于0.所以“==”应该做。你为什么把_room_变成acquire()? – 2012-04-15 23:18:31
如果允许两位访客交换房间,或者在这种情况下会导致首选结果僵局? – 2012-04-15 23:35:13