予想した内容と違った

wait, notifyはもう古い

waitと notifyの代わりの話だからConditionの話だと思ったらぜんぜん違っていた。

notifyの代わりってCountDownLatchじゃむりだよー。notifyAllを使った特定の動作の真似ならできるけど。


スレッドの終了監視はFuture#get使うし、スレッドの同期はサイクリックバリア使うほうが多いかな。ブロッキングキューとスレッドプールがあるのでセマフォはあんまり使うという場面は想定しにくいかな。監視用スレッド使ってExecutorService#invokeAllを使うと結構すっきりしたりする。

1つのRunnable(やCallable)で同期ポイントを入れていって複雑な処理をするってことはほとんどなくて、同期タイミングごとに区切った小さなRunnable(やCallable)を用意して細かいタスクを大量に詰め込むのが一般的な使い方かと。


カウントダウンラッチはその名の通りカウントの値でコントロールするだけ使い方を想定しているから、スレッドの同期とは直接的に何の関係もないんだよね。想定されたAPIの使い方から離れた場合ってのは他人がソース見たときにおそらく理解するまでに時間がかかる(斜め読みできない)から、コメントをちゃんと書いておこう。


でもまずは基本となるスプリアスウェイクアップがない同期機構を用意してほしいと思ってる人は多いと思う。