そのため、セマフォの使用に問題があります。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
カウントが正しく出ていません。
それで、私は何をすべきですか?
編集:
何か他のことで忙しかったので、質問を復活させます。部屋がいっぱいになるため、問題は発生しません。ロックは、room1 の person1 が room2 に入りたいと同時に、room2 の person2 が room1 に入りたいときに発生します。私が理解しているように、おそらく同期と関係がありますか?リリース前にスタックするため、リリースは呼び出されません。私が理解しているように、1 つの部屋の取得と解放を同時に呼び出すことはできません。したがって、基本的に、room1 のセマフォ リリースは、room2 と同じように、accuire が呼び出されると同時に呼び出すことはできませんか? 私は初心者のコーダーであり、同期はまだそれほど明確ではありません。いずれかから同期を削除しても機能しないようです (これもかなり間違っています)。