quabbinの日記: SimpleDateFormat
java.text.SimpleDateFormat#format(java.util.Date) がnullを許可しているかどうかというのを忘れたので(記憶では許可してなかったはずだけど、確証が欲しかったから)javaのソースコードを覗いてみたら、まったく違う問題を発見してしまった…。
こういう話は既にどこかであるだろうとおもったら案の定で、iyhy。
java.text.SimpleDateFormat はスレッドセーフではない
なんで知らないんだよ…>私
ここで提示されている解決選択肢うち、
・独自のDateFormatを実装する
・唯一のスレッドからしか、SimpleDateFormatが使われない作りにする
は設計変更になるので、最初から意図していた場合でないと重いですね。
独自のDateFormatを実装するのは、SimpleDateFormatのアダプタクラスを作成すればOKか…それもいいけど、すべてのメソッドを書くのが面倒だなぁ…。
しかもformat()はfinalされてるから、そこらじゅうのソースを手直ししなきゃならない。
さすがにそれはできないなぁ。
となると、
・format()やparse()を使うところを、 synchronized 宣言で囲む
になるのでしょうが、どうもすっきりしない感が強い。
そこでJavadocを読んでみると、
>It is recommended to create separate format instances for each thread.
と書いてある。
ということで、スレッドセーフの粒度はインスタンスが違えば問題ないようなので、利用するところでclone()することとした。
clone内部を覗いてみると、どうやら適切にcloneされているようなので、これで問題解決としよう。
…われながら手抜きだな…。
SimpleDateFormat More ログイン