Tôi đang cố gắng tìm hiểu câu chuyện cơ bản của Semaphore trong vấn đề Ăn uống Triết học. Ngay bây giờ, tôi có một mảng của lớp Đũa, và mỗi Đũa có một semaphore với 1 giấy phép có sẵn:Các vấn đề về semaphore trong Java với các nhà triết học ăn uống
public class Chopstick
{
Thread holder = null;
private Semaphore lock = new Semaphore(1);
public synchronized void take() throws InterruptedException
{
this.lock.acquire();
holder = Thread.currentThread();
}
public synchronized void release()
{
this.lock.release();
holder = null;
}
}
Biến giữ được sử dụng cho một chức năng mà tôi không chắc chắn tôi cần:
public synchronized void conditionalRelease()
{
if (holder == Thread.currentThread())
{
holder = null;
this.lock.release();
}
}
Chương trình biên dịch và chạy, nhưng dường như có một số rắc rối khi nhả đũa. Đôi khi, đôi đũa được thả ra, đôi khi chúng không có. Khi họ không phát hành, chương trình cuối cùng bị treo lên khi tất cả đũa được lấy và một nhà triết học đang đói.
Đây là mã trong lớp Triết gia để giải phóng đũa sau một khoảng thời gian ngẫu nhiên:
System.out.println(this.name + " is eating");
Thread.sleep(this.getRandTime());
System.out.println(this.name + " has finished eating");
rightChopstick.release();
System.out.println(this.name + " has released the right chopstick");
leftChopstick.release();
System.out.println(this.name + " has released the left chopstick");
chương trình của tôi không ra "Triết gia 0 đã ăn xong", ví dụ, và tiếp tục thực hiện. Hai dòng còn lại không bao giờ xuất ra, vì vậy rõ ràng có điều gì đó sai trái theo cách tôi đang phát hành.
Mọi trợ giúp đều được đánh giá cao.
Hà! Đó là chính xác những gì nó đã được ... Tôi đã phải thực hiện hai cách khác nhau này cho một bài tập và tôi dán mã sao chép cho phương pháp đầu tiên và quên để loại bỏ các từ khóa đồng bộ. Nice tìm. –