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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-07 14:40:17906ブラウズ

Why is SimpleDateFormat Not Thread-Safe?

SimpleDateFormat がスレッド セーフティの問題を引き起こすのはなぜですか?

概要

コード例:問題

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class SimpleDateFormatExample {

    public static void main(String[] args) throws InterruptedException {
        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        final List<String> formattedDates = new ArrayList<>();
        final ExecutorService executorService = Executors.newFixedThreadPool(10);

        for (int i = 0; i < 1000; i++) {
            executorService.submit(() -> {
                final String date = simpleDateFormat.format(new java.util.Date());
                formattedDates.add(date);
            });
        }

        executorService.shutdown();
        executorService.awaitTermination(1, TimeUnit.MINUTES);

        // Check for any duplicate formatted dates
        // This check demonstrates the potential for incorrect formatting due to thread safety issues
        for (int i = 0; i < formattedDates.size(); i++) {
            for (int j = i + 1; j < formattedDates.size(); j++) {
                if (formattedDates.get(i).equals(formattedDates.get(j))) {
                    System.out.println("Duplicate formatted date detected: " + formattedDates.get(i));
                }
            }
        }
    }
}

問題分析

SimpleDateFormat は中間結果をインスタンス フィールドに保存するため、複数のスレッドが同じインスタンスを同時に使用するとデータ破損が発生しやすくなります。コード例では、複数のスレッドが 'format()' メソッドを呼び出します。これにより、インスタンス フィールドの共有状態が原因で、時刻の書式設定が不正確になり、結果が重複する可能性があります。

FastDateFormat のスレッド セーフティ

FastDateFormat は、SimpleDateFormat とは異なり、インスタンス フィールドを回避し、スレッド ローカル変数を利用することでスレッドセーフな設計を採用しています。内部カレンダーインスタンス用。これにより、各スレッドが独自の専用カレンダーを持つようになり、競合やデータ破損のリスクが排除されます。

スレッドの安全性を向上させるための代替手段

FastDateFormat 以外の、処理のための代替ソリューションスレッドセーフな日付形式には次のものが含まれます:

  • のスレッドローカル インスタンスの利用スレッド プール内の SimpleDateFormat。
  • Joda-Time DateTimeFormat など、スレッドセーフな日時書式設定を提供するライブラリを使用します。

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

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