ホームページ > Java > &#&チュートリアル > SimpleDateFormat がスレッドセーフではないのはなぜですか?また、スレッドセーフな日付形式を保証するにはどうすればよいですか?

SimpleDateFormat がスレッドセーフではないのはなぜですか?また、スレッドセーフな日付形式を保証するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-09 10:09:07
オリジナル
298 人が閲覧しました

Why is SimpleDateFormat Not Thread-Safe, and How Can I Ensure Thread-Safe Date Formatting?

SimpleDateFormat のスレッド セーフ問題を理解する

SimpleDateFormat はスレッド セーフでないことが知られており、複数のスレッドが同じインスタンスに同時にアクセスすると潜在的な問題が発生します。この制限の背後にある理由と、スレッドセーフな対応する FastDateFormat との違いを調べてみましょう。

SimpleDateFormat のスレッド セーフの問題

SimpleDateFormat は、Calendar オブジェクトを含むインスタンス変数の内部状態を維持します。複数のスレッドが同じインスタンスにアクセスしようとすると、互いの中間結果を上書きして破損を引き起こす可能性があります。

たとえば、parse メソッドは Calendar オブジェクトを初期化しますが、最初のスレッドが完了する前に別のスレッドが parse を呼び出した場合、カレンダーがリセットされ、最初のスレッドの結果に影響します。

FastDateFormat: 克服Thread-Safety

FastDateFormat は、SimpleDateFormat の代わりに導入され、スレッド セーフティの問題に対処しました。 SimpleDateFormat とは異なり、FastDateFormat は状態をスレッド ローカル変数に保存し、各スレッドが独自の独立したインスタンスを持つことを保証します。

ThreadLocal を使用することにより、FastDateFormat は、複数のスレッドが形式オブジェクトにアクセスするときに競合が発生しないことを保証します。

問題を示すコード例

次のコードを考慮して、スレッド セーフティの問題を示します。 SimpleDateFormat:

import java.text.SimpleDateFormat;

public class SimpleDateFormatThreadSafety {

    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Thread thread1 = new Thread(() -> {
            try {
                System.out.println(sdf.parse("2023-03-08"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                System.out.println(sdf.parse("2024-04-16"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        thread1.start();
        thread2.start();
    }
}
ログイン後にコピー

このコードを実行すると、スレッドが同じ SimpleDateFormat インスタンスに同時にアクセスするため、日付解析に一貫性がなくなるか、不正確になる可能性があります。

スレッド セーフティのベスト プラクティス

スレッドセーフな日付形式を確保するには、次に従ってください。推奨事項:

  • 可能であれば、同時アクセスにはスレッドローカルの SimpleDateFormat インスタンスまたは FastDateFormat インスタンスを使用します。
  • 日付フォーマットには、joda-time DateTimeFormat やJava 8 DateFormatter.
  • 適切に行わずにスレッド間で日付形式を共有することは避けてください。同期メカニズム。

以上がSimpleDateFormat がスレッドセーフではないのはなぜですか?また、スレッドセーフな日付形式を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート