私はそれを試していますが、質問:ウィキでは、そのアルゴリズムの3番目のポイントは次のように述べています:
フォークを持った哲学者がリクエスト メッセージを受信すると、フォークが汚れていない場合はフォークを保持しますが、汚れている場合は放棄します。フォークを送る場合は、そうする前にフォークをきれいにします
これがデッドロックにつながらない理由を理解しようとしていますか? ある哲学者が 1 つのクリーンなフォークを持っていて、隣のダイナー/哲学者から別のクリーンなフォークを取得するのを待っている場合、その人も同様にフォークを待っている場合、これは累積してデッドロックになりますか? ある哲学者が常に他の哲学者からのフォークを待っている?
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;
}
同期する場所がわかりませんが、それでも同期が必要だと感じています。たとえば、2 人のダイナーが 1 人目と 3 人目が 2 人目の哲学者にフォークを頼んだとします。