「複数のスレッドからDateFormatを実行した場合に日付が不正な値になる」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
&bold(){【現象】}
DateFormat(のサブクラス)をstatic変数で保有している場合、DateFormatの「format」メソッドや「parse」メソッドを使用したときに不正な日付が取得されてしまう。
&bold(){【例】}
public class EditDate() {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
public Date getDate(String dt) {
return sdf.parse(dt);
}
}
上記のような場合、複数のスレッドからgetDateを呼び出した場合、期待した値とは別の値が取得されてしまう事がある。
&bold(){【原因】}
DateFormatクラスはスレッドセーフではないため、複数のスレッドから同時にアクセスされた場合の結果は保証されていない。
&bold(){【解決方法】}
案1:
DateFormatをstatic変数で持たない。
上記例の場合、getDateがstaticメソッドではないため、コンストラクタでDateFormatのインスタンスを生成する。
// 最初はnullで宣言する
private SimpleDateFormat sdf = null;
public EditDate() {
// コンストラクタでDateFormatのインスタンスを生成する
sdf = new SimpleDateFormat("yyyy/MM/dd");
}
- synchronized でスレッドセーフになるのでは? -- nave (2012-07-06 15:37:20)
#comment
&bold(){【現象】}
DateFormat(のサブクラス)をstatic変数で保有している場合、DateFormatの「format」メソッドや「parse」メソッドを使用したときに不正な日付が取得されてしまう。
&bold(){【例】}
public class EditDate() {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
public Date getDate(String dt) {
return sdf.parse(dt);
}
}
上記のような場合、複数のスレッドからgetDateを呼び出した場合、期待した値とは別の値が取得されてしまう事がある。
&bold(){【原因】}
DateFormatクラスはスレッドセーフではないため、複数のスレッドから同時にアクセスされた場合の結果は保証されていない。
&bold(){【解決方法】}
案1:
DateFormatをstatic変数で持たない。
上記例の場合、getDateがstaticメソッドではないため、コンストラクタでDateFormatのインスタンスを生成する。
// 最初はnullで宣言する
private SimpleDateFormat sdf = null;
public EditDate() {
// コンストラクタでDateFormatのインスタンスを生成する
sdf = new SimpleDateFormat("yyyy/MM/dd");
}
- synchronized でスレッドセーフになるのでは? -- nave (2012-07-06 15:37:20)
- 参考:http://www.ne.jp/asahi/hishidama/home/tech/java/date.html#synchronized_DateFormat -- nave (2012-07-06 15:37:33)
#comment