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

「複数のスレッドからDateFormatを実行した場合に日付が不正な値になる」の編集履歴(バックアップ)一覧はこちら

複数のスレッドからDateFormatを実行した場合に日付が不正な値になる」(2012/07/06 (金) 15:37:33) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

&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

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

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