Java界隈では結構有名な話らしが、私はつい先日職場の同僚に指摘されて初めて知った事実。 SimpleDateFormatを使用する箇所でいちいちnewするものどうかと思い、final staticで使いまわしていたところ、実はスレッドセーフではないので、マルチスレッド下で実行すると計算結果が違ってくるという恐ろしい話。 初め聞いた時はにわかに信じられず(だってfinal staticで使いまわすような機能なので・・・) SimpleDateFormatのソースコードを眺めていると、スーパークラスのDateFormatにCalendar型の「calendar」というクラス変数を持っていて、SimpleDateFormatのformat()とparse()の中で豪快に上書きしているではないか! これは残念なことと思い、マルチスレッド下で問題を再現させるコードを書いてみた。 Task.java