【現象】
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