Hand と Fork 内のフラグは別々でなければならない. Handのは,手(自分)がフォークを握っていることを示し, Forkのは,そのフォークが誰かに握られていることを示すため, 情報が異なる. フォーク側にだれに握られているかの情報をつける手もあるが, エレガントでない. スパゲッティを2本フォークで食うのはおかしいとのこと. ごもっともです(笑) それをいったら,他人を共有するのは汚くねーかぁ? プログラムの不備と仕様の不備の切り分けの難しさ. 本問題は業界ではよく知られた問題なので, 私らなら容易に補完できるが,そうでない人にはそうでないのかもしれない. 一応,定番の答えからは, 問題文に,自分が両方取る機会がないことを知れば, とりあえず手持ちのフォークを置いて,デッドロックを回避することは 書いていない. よって,デッドロックが起こるのは,プログラミングの問題ではなく, 仕様の問題である. しかし,問題文から,哲学者は互いの状況を把握できるようにも見える. よって,そこから推測して,デッドロック回避ロジックを組み込むのが プログラマの真心ともいえる. 問題の不備とプログラムの不備の切り分けは難しい. 一応,教科書的には,デッドロックが起こるのは,問題の不備であって, プログラムの不備ではない. (わざとデットロックが起こるような問題にしてある.) 並行動作といっても,for文でループするから,前のほうの哲学者が どうしても有利になる. 手はスレッドにしてあるので,両手の動作は独立している, よって,同時にフォークを取ることも原理的には可能. # 実際,単一CPUの場合は不能だが. ワードなどのワープロを使った場合,図はワープロ内に張り込んでよいですよ. 重要な属性の説明はちゃんと書きましょう. 一人では食事ができない!という指摘はすばらしい! クラスの説明においては, 重要な状態属性の説明が行われているか否かがポイントとなる. どーも,写したとしか思えないセリフが続出, たとえば「現役相撲力士にでさえ有り得ないような生理現象が 今回の問題の中で頻繁に起こっている。これは現代医学に反する 現象であり、医学に対する挑戦とも受け止められかねない。」 など. ユニークではあるが,連発されると,やはり白けるなぁ(笑) フォークが同時にとれない!と指摘している人がいるが, 手がスレッド化していて,独立に動いているため, 同時につかむことは可能な表現になっている. インスタンス間の振る舞いをフローチャート風でかこう としていた方がいますが,平行プログラムは,少なくとも, 1個のフローでは片付きません. この例では,哲学者3 手6 フォーク3 の12個の流れが平行して 動いているので,それをちゃんと書くのは並大抵じゃぁないでしょう. left.start(); right.start(); の意味合い. 実際には,その影響力は大きいが,必ず左からスタートするわけではないし, Philoがインスタンス化される最初の1回のみの影響である. mainメソッド呼び出しをインスタンスと図示する人がいたが, これは誤り.