食事する哲学者問題の解決が課題

問題自体は大変有名なものらしい(食事する哲学者の問題 - Wikipedia)。今回は簡単にするために思索の時間がなくなっている。微妙な違いとして、フォークの代わりに箸になっている。

  1. Philosoperクラス、Chopstickクラスを作った。
  2. ChopstickクラスではSemaphoreを持たせた。
  3. Chopstick.pickedUpではSemaphoreのacquireを行う。putDownではreleaseを行う。
  4. Philosopher.pickUpChopstickL/RからChopstick.pickedupメソッドを呼ぶようにした
  5. ChopstickのpickedUpとputDownはsynchronizedされている


これで、デッドロック状態は起きるようになりました。


しかしここからが問題で、Monitorパターンをつかって、デッドロックが起きないようにする、というものなのです。一番シンプルな解法は、Monitorがキューをもっていて、一度に一人しか食事にありつけないようにする、というあまりスレッドを生かさないやりかた。もうすこしよいやり方は、つねに右から箸をとるので、左が開いていることを確認してから右をとり、左をとる、というやりかた、、、かな??