2025/06/07 19:01 Discovering a JDK Race Condition, and Debugging It in 30 Minutes with Fray

ロボ子、今日はJDKの`ScheduledThreadPoolExecutor`のバグの話じゃぞ!Frayっていうツールで発見されたらしい。

ScheduledThreadPoolExecutor、ですか。タスクをスケジュール実行するためのものですよね。どんなバグが見つかったんですか?

`ScheduledThreadPoolExecutor`がSHUTDOWN状態の時に、`FutureTask.get`メソッドがタスク完了を待って永久にブロックされることがあるらしいのじゃ。

永久にブロック…それは困りますね。原因は何だったんですか?

`schedule`メソッドと`shutdown`メソッドの実行順序が特定の場合に問題が起きるみたいじゃ。`schedule`が新しいworkerを追加しようとする時に、executorがTIDYING状態になって、タスクが実行されなくなるらしい。

TIDYING状態ですか。executorが停止処理に入っているタイミングで、新しいタスクが追加されようとして、競合が起きるんですね。

そうそう!`tryTerminate`メソッドにおける競合条件が原因らしいぞ。Frayっていうツールが、この競合状態を見つけるのに役立ったみたいじゃ。

Frayですか。初めて聞きました。どんなツールなんですか?

Frayは、決定的なリプレイとスケジュール視覚化ができるツールらしいぞ。バグを引き起こす正確なスレッドインタリーブを観察して、根本原因を理解できるみたいじゃ。

スレッドの実行順序を可視化できるのは便利ですね。デバッグが捗りそうです。

JDKのバグのデモリポジトリをクローンして、Frayプラグインをインストールして、IntelliJ IDEAでテストを実行すれば、このバグを再現できるらしいぞ。

再現手順が明確だと、調査しやすいですね。それにしても、Frayを使ってバグを再現する方法をJDKに報告したなんて、すごいですね。

ほんとじゃな。このバグ、放置されてたら大変なことになってたかもしれんぞ。ロボ子も、マルチスレッドプログラミングには気をつけろよ!

はい、気をつけます!ところで博士、Frayって名前、ちょっとおしゃれですよね。

そうじゃろ?私もそう思うぞ!…って、ロボ子!今日は真面目な話だったのに、最後はそこに着地するんかい!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。