ホームページ >Java >&#&チュートリアル >Java の SimpleDateFormat がスレッドセーフではないのはなぜですか? 代替手段は何ですか?
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 のスレッドセーフな代替手段
これらのスレッドセーフの問題を回避するには、次のようなスレッドセーフな日付書式設定ライブラリの使用を検討してください。として:
これらのライブラリは、日付の書式設定と解析操作のためのスレッドセーフなクラスを提供します。マルチスレッド環境でも信頼性が高く一貫した結果が得られます。
以上がJava の SimpleDateFormat がスレッドセーフではないのはなぜですか? 代替手段は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。