关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题class Fork {private boolean taken=false;synchronized void put() {taken=false;notify();}synchronized void get()throws InterruptedException
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/27 13:59:01
![关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题class Fork {private boolean taken=false;synchronized void put() {taken=false;notify();}synchronized void get()throws InterruptedException](/uploads/image/z/13578018-42-8.jpg?t=%E5%85%B3%E4%BA%8E%E5%93%B2%E5%AD%A6%E5%AE%B6%E5%B0%B1%E9%A4%90%E9%97%AE%E9%A2%98%E4%B8%ADwait%28%29%E7%9A%84%E8%BF%90%E7%94%A8%2C%E4%BB%A5%E4%B8%8B%E8%BF%99%E4%BA%9B%E4%BB%A3%E7%A0%81%E6%98%AF%E5%AF%B9%E7%9A%84%E8%BF%98%E6%98%AF%E9%94%99%E7%9A%84%3F%E6%98%AF%E5%90%A6%E8%A7%A3%E5%86%B3%E4%BA%86%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98class+Fork+%7Bprivate+boolean+taken%3Dfalse%3Bsynchronized+void+put%28%29+%7Btaken%3Dfalse%3Bnotify%28%29%3B%7Dsynchronized+void+get%28%29throws+InterruptedException)
关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题class Fork {private boolean taken=false;synchronized void put() {taken=false;notify();}synchronized void get()throws InterruptedException
关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题
class Fork {
private boolean taken=false;
synchronized void put() {
taken=false;
notify();
}
synchronized void get()
throws InterruptedException {
while (taken) wait();
taken=true;
}
}
class Philosopher extends Thread {
private Fork left; private Fork right;
Philosopher(...Fork l,Fork r) {
...left = l; right = r; ...
}
public void run() {
try {
while (true) {
// thinking...
// hungry:
right.get(); left.get();
// eating...
// finished eating:
right.put(); left.put();
} } catch (InterruptedException e) {} }}
这里面一个线程会调用get()方法两次,分别去拿右边和左边的叉子,但是我总觉得这个代码有问题,当第一个线程第一次调用get()方法时会把taken值变成True,导致了这个线程在第二次调用get()方法去拿左边的叉子时进入wait状态从而没法拿左边的叉子.
关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题class Fork {private boolean taken=false;synchronized void put() {taken=false;notify();}synchronized void get()throws InterruptedException
这里fork里的taken变量不是static的,所以各实例的该变量是互相独立的
因此,第一次get()之后只是right这个fork的taken被修改成true了,left仍然是false