【日記】JavaのSimpleDateFormatのマルチスレッド問題
Java開発者としてはSimpleDateFormatがスレッドセーフではないことは常識だと思っているのですが、仕事で保守しているシステムでこのオブジェクトをstaticで保持して、マルチスレッドでアクセスするという実装があることが最近発覚して対応に追われました。
ちなみにそのシステムは15年くらい稼働していて、SimpleDateFormatオブジェクトのstatic定義のコードも15年前に実装されたという恐ろしい事実。
なぜ今になって発覚したのか
該当機能で障害が発生したから。
具体的にはSimpleDateFormatのparseメソッドで文字列型を日付型に変換してSQLのパラメータに設定しているところで日付不正のエラーが発生して調査を行って発覚。
当然formatメソッドを使っている箇所もあるので、日付のすり替わりが発生しているかもしれないですが、正直調査しきれませんでした。
実施した対処
そのシステムがレガシーシステムで頻繁に改修するのにCI/CDなどの環境が全く整備されていません。
当然ソースコードの静的解析なども行う文化や仕組みもないので、まず対象システムのJavaプログラムのを静的解析ツールを使って、ソース解析しました。
解析した結果、障害が発生した箇所以外にも何箇所か同じようなコードがあり、影響調査と対応が必要になりました。
他にも顕在化していないコーディングバグも見つかりました。
僕と同じように古いJavaのシステムを運用維持開発されている方でソースの静的解析を実施していない場合は一度実施してみると恐ろしいバグが見つかるかもしれませんよ。