理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

SimpleDateFormat がマルチスレッドで使われて人間が不幸になる

人のソースレビューをしていると、SimpleDateFormat クラスが(暗黙のうちに)マルチスレッドで使いまわされるようなコードを見てしまいました。

にも書いたけど、JavaDoc にも明記されているとおり、SimpleDateFormat はスレッドセーフではありません。それにも関わらず、マルチスレッド処理がフレームワークに隠されているような場合(特に Web 系フレームワーク)、使用するクラスが「スレッドセーフなのかどうか」を確認せずに使いがちな感じがあります。

たとえば

    private static final SimpleDateFormat SDF = hogehoge

なんて宣言がされているケースは、要注意だと思います。同期化されていないクラスをマルチスレッドで使用してエラーとなるケースは、スタックトレースが意味不明になることが多く、解析に時間がかかることがままあります。static で持ち回すのではなく、都度インスタンスを生成するようにするか、代替のクラスを使用するなどしたほうがいい。