Vì vậy, tôi gặp vấn đề khi sử dụng semaphore. Viết mã có 4 phòng và một số khách. Mỗi phòng đều có một số tiền nhất định cho số lượng khách truy cập mà họ có thể giữ. Vì vậy, vào một phòng đầy đủ sẽ kích hoạt một chờ đợi(). Các du khách không được rời khỏi phòng trước khi họ có thể vào phòng khác, vì vậy họ luôn ở trong phòng.Bế tắc bế tắc
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();
}
Bế tắc xuất hiện khi 2 người đang cố gắng vào phòng của nhau. Cũng vì một số lý do, số lượng placesLeft
không được phát hành đúng.
Vì vậy, tôi nên làm gì?
CHỈNH SỬA:
Bạn đang bận với thứ khác, làm mới câu hỏi. Sự cố không xảy ra do các phòng đầy, khóa các sự kiện khi person1 từ room1 muốn vào room2 và cùng một lúc person2 từ room2 muốn vào room1. Như tôi understant của nó một cái gì đó để làm với synchrozing có thể? Họ gặp khó khăn trước khi phát hành, vì vậy việc phát hành không được gọi. Như tôi hiểu một phòng accuire và phát hành không thể được gọi là cùng một thời gian. Vì vậy, cơ bản room1 semaphore phát hành không thể được gọi là cuz cùng một lúc accuire được gọi là, tương tự cho room2? Tôi là coder và đồng bộ hóa newbie chưa rõ ràng lắm. Loại bỏ đồng bộ hóa từ một hoặc không có vẻ như làm việc (cũng là sai lầm hoàn toàn).
Bế tắc là kết quả hợp lý nếu cả hai phòng đều đầy. –
"<= 0" của bạn là một dấu hiệu của lỗi.Giá trị không bao giờ nên dưới 0. Vì vậy, "==" nên làm. Tại sao bạn đi qua _room_ để có được()? –
Hai khách truy cập có được phép đổi phòng hoặc bế tắc kết quả ưu tiên trong trường hợp này không? –