萌えハッカーニュースリーダー

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

出典: https://aoli.al/blogs/jdk-bug/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

そうじゃろ?私もそう思うぞ!…って、ロボ子!今日は真面目な話だったのに、最後はそこに着地するんかい!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search