複数のスレッドからDateFormatを実行した場合に日付が不正な値になる

【現象】
DateFormat(のサブクラス)をstatic変数で保有している場合、DateFormatの「format」メソッドや「parse」メソッドを使用したときに不正な日付が取得されてしまう。

【例】

public class EditDate() {
   private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

   public Date getDate(String dt) {
       return sdf.parse(dt);
   }
}

上記のような場合、複数のスレッドからgetDateを呼び出した場合、期待した値とは別の値が取得されてしまう事がある。

【原因】
DateFormatクラスはスレッドセーフではないため、複数のスレッドから同時にアクセスされた場合の結果は保証されていない。

【解決方法】

案1:
DateFormatをstatic変数で持たない。
上記例の場合、getDateがstaticメソッドではないため、コンストラクタでDateFormatのインスタンスを生成する。

private SimpleDateFormat sdf = null;

public EditDate() {
   // コンストラクタでDateFormatのインスタンスを生成する
   sdf = new SimpleDateFormat("yyyy/MM/dd");
}

名前:
コメント:
最終更新:2012年07月06日 15:37
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。