作业帮 > 综合 > 作业

关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/04/29 05:19:36
关于哲学家就餐问题中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()的运用,以下这些代码是对的还是错的?是否解决了死锁问题
这里fork里的taken变量不是static的,所以各实例的该变量是互相独立的
因此,第一次get()之后只是right这个fork的taken被修改成true了,left仍然是false