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


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

【現象】
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");
}

名前:
コメント:
ツールボックス

下から選んでください:

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