ホームページ >Java >&#&チュートリアル >Java の SimpleDateFormat がスレッドセーフではないのはなぜですか? 代替手段は何ですか?

Java の SimpleDateFormat がスレッドセーフではないのはなぜですか? 代替手段は何ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-08 20:15:13214ブラウズ

Why is Java's SimpleDateFormat Not Thread-Safe, and What are the Alternatives?

Java の SimpleDateFormat スレッド セーフティの欠陥について

SimpleDateFormat は、日付の書式設定と解析を可能にする Java のクラスです。ただし、他の多くの Java クラスとは異なり、SimpleDateFormat はスレッドセーフではありません。これにより、複数のスレッドで同時に使用すると、予期しない動作が発生する可能性があります。

SimpleDateFormat はスレッド セーフではないのはなぜですか?

スレッド セーフの問題の核心は、SimpleDateFormat にあります。内部状態の管理。このクラスは、書式設定と解析操作を実行するために、Calendar オブジェクトを含むインスタンス フィールドを維持します。複数のスレッドが同じ SimpleDateFormat インスタンスにアクセスしようとすると、互いの操作に干渉する可能性があります。

欠陥を示すコード例

次のコード スニペットを考えてみましょう。

class ThreadSafeTest {

    static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    System.out.println(sdf.format(new Date()));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    System.out.println(sdf.parse("2023-01-01"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
    }
}

この例では、2 つのスレッドが書式設定と同じ SimpleDateFormat インスタンスに同時にアクセスし、日付を解析しています。予期される出力は、一連の書式設定された日付と解析された日付ですが、SimpleDateFormat のスレッドセーフではない性質により、結果が混乱する可能性があります。出力には、間違った日付または混合した日付が含まれる可能性があります。

SimpleDateFormat のスレッドセーフな代替手段

これらのスレッドセーフの問題を回避するには、次のようなスレッドセーフな日付書式設定ライブラリの使用を検討してください。として:

  • Joda-Time: https://www.joda.org/joda-time/
  • FastDateFormat: https://www.joda.org/joda-time/apidocs/org/joda/time/ format/FastDateFormat.html

これらのライブラリは、日付の書式設定と解析操作のためのスレッドセーフなクラスを提供します。マルチスレッド環境でも信頼性が高く一貫した結果が得られます。

以上がJava の SimpleDateFormat がスレッドセーフではないのはなぜですか? 代替手段は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。