2014年10月15日

java.util.Date が同期化されない件について

java.text.SimpleDateFormat については API仕様 に "日付フォーマットは同期化されません。"と明記されており、スレッドセーフでないことは周知の事実ですが、 java.util.Date も(利用方法によっては)スレッドセーフでないことが判明しましたので、メモしておきます。
タネ(原因)が理解できていない状態では再現させることが難しく、しかし運が悪ければ発生してしまうため、ご注意下さい。
スタックトレースが基底API(しかも toString() )のものだったこともあり、私自身はまず実行環境を疑ってしまいました。


実行環境
Java SE : 7u60

【検証プログラム】

なお、 java.util.Date のソースファイルを確認しましたが、 normalize() にて処理結果をキャッシュしており、そのキャッシュにアクセスする各処理が同期化されていないことが原因でした。
また、 JDK1.4 から JDK1.7 まで、この付近の処理は修正されていないため、どのバージョンでも再現すると考えられます。


posted by red at 23:33| Comment(0) | TrackBack(0) | Java | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック