• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:notifyAll()の挙動について)

notifyAll()の挙動について

このQ&Aのポイント
  • マルチスレッドにおいて、notifyAll()が他のスレッドにwaitの解除を通知する方法について知りたい。
  • sleep sortをマルチスレッドで実装しようとしているが、notifyAll()を使用しても正しくソートされない。
  • notifyAll()はすべてのスレッドに同時に告知をするわけではない可能性があるため、スレッドを同期させる他の方法を探している。

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

>このことから察するにnotifyAllはすべてのスレッドに同時に告知をするものではないことと、この告知に意外と時間がかかる、と言う風に推察しました。 synchronizedされていますから同時に動くことがないことに注意してください。 wait()は一時的にsynchronizedでのロック状態を一時的に解除し自スレッドが停止し他スレッドが動作できるようにします。 notifyAll()呼出しで他のスレッドに告知はされますが、wait()している他スレッドが再開できるのは、notifyAll()呼出しスレッドのsynchronizedでのロック状態解除後になります。 またwait()していた他スレッドはロックの再取得で奪い合いをしロックが取得できたスレッドが再開されロックを取得できなかったスレッドはロックの再取得のチャンスを待つことになります。

mental_HELLth
質問者

お礼

回答いただきましてありがとうございました! 理解しました! つまりこの処理は並列処理にはなっていない、ということですね? 結局今回の例で行けば30個スレッドがwaitしているところにnotifyAllがされると、ロックを取得できたものから順々にスレッドが実行されていく、という処理がなされると理解しました。 ということはnotifyAllは同時に実行してほしい時に使えるものではないと言うことですね。 ともあれ非常にわかりやすい回答でした! ありがとうございました。

関連するQ&A