パスワードを忘れた? アカウント作成
432100 journal

quabbinの日記: SimpleDateFormat

日記 by quabbin

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されているようなので、これで問題解決としよう。

…われながら手抜きだな…。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...