食事する哲学者問題の解決が課題
問題自体は大変有名なものらしい(食事する哲学者の問題 - Wikipedia)。今回は簡単にするために思索の時間がなくなっている。微妙な違いとして、フォークの代わりに箸になっている。
- Philosoperクラス、Chopstickクラスを作った。
- ChopstickクラスではSemaphoreを持たせた。
- Chopstick.pickedUpではSemaphoreのacquireを行う。putDownではreleaseを行う。
- Philosopher.pickUpChopstickL/RからChopstick.pickedupメソッドを呼ぶようにした
- ChopstickのpickedUpとputDownはsynchronizedされている
これで、デッドロック状態は起きるようになりました。
しかしここからが問題で、Monitorパターンをつかって、デッドロックが起きないようにする、というものなのです。一番シンプルな解法は、Monitorがキューをもっていて、一度に一人しか食事にありつけないようにする、というあまりスレッドを生かさないやりかた。もうすこしよいやり方は、つねに右から箸をとるので、左が開いていることを確認してから右をとり、左をとる、というやりかた、、、かな??