所以我有一個使用信號量的問題。 寫一個代碼,其中有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