我正在尝试,但是有一个问题:在wiki中,该算法的第三点说:
当一个有叉子的哲学家收到请求消息时,如果叉子是干净的,他会保留叉子,但如果叉子脏了,他就会放弃。如果他把叉子送过来,他会在这样做之前清理叉子
我试图理解为什么这不会导致僵局?如果一位哲学家有一个干净的叉子,并等待从邻近的餐厅/哲学家那里得到另一个干净的叉子,而后者也在等待叉子,这可能会累积成僵局,对吗?一位哲学家总是在等待另一位哲学家的分叉?
ps:我是线程和并发的新手,把它当作一个学习项目。
编辑:给出叉子的实际位置,发布此消息以询问叉子是否应该是可变的。pLeft , pRight 是左右哲学家, fLeft 和 fRight 是左右叉子。
private Fork giveFork(Philosopher diner) {
Fork forkToGive;
if (this.pLeft.equals(diner)) {
// give left fork to left philosopher
if (this.fLeft.isClean)
forkToGive = null; // don't give
else {
forkToGive = new Fork(this.fLeft.id, true); // give the fork
}
} else if (diner.pRight.equals(this)) {
// give right fork to right philosopher
if (this.fRight.isClean)
forkToGive = null;
else {
forkToGive = new Fork(this.fRight.id, true);
}
} else {
// default value , i'm not yet sure if this code
// can be theoretically reached
forkToGive = null;
}
return forkToGive;
}
我还没有弄清楚在哪里同步它,但我觉得仍然需要同步。就像当两个用餐者时,说第一个和第三个向第二个哲学家要叉子。