Java の SimpleDateFormat: スレッド セーフの問題を明らかにする
Java の SimpleDateFormat クラスは、スレッド セーフでないことで悪名を高めています。マルチスレッド環境では懸念されます。この問題の根本を理解するために、クラスの内部を詳しく調べてみましょう。
犯人: インスタンス フィールドの操作
SimpleDateFormat は、中間結果を格納するためにインスタンス フィールドに依存しています。これは、複数のスレッドが同じインスタンスに同時にアクセスする場合に問題を引き起こします。各スレッドは、他のスレッドによって設定された値を上書きまたは破損する可能性があり、その結果、不正確な結果が生じる可能性があります。
たとえば、parse() メソッドは、実行中にクリアおよび変更される Calendar インスタンス フィールドを使用します。最初のスレッドが操作を完了する前に別のスレッドが parse() を呼び出すと、カレンダーがリセットされ、2 番目のスレッドの計算が中断されます。
コード例:
// Thread 1 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse("2023-03-08"); // Calendar is cleared and modified // Thread 2 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse("2023-04-01"); // Incorrect result due to cleared calendar
FastDateFormat: スレッドセーフ代替
SimpleDateFormat とは異なり、FastDateFormat はスレッドセーフになるように設計されています。これは、スレッドローカル キャッシュを採用し、各スレッドが独自の専用フォーマット インスタンスを持つことを保証することによって実現されます。その結果、データの整合性を損なうことなく、複数のスレッドが個別に FastDateFormat を使用できます。
結論:
SimpleDateFormat のスレッド セーフティの問題は、共有インスタンス フィールドへの依存に起因します。同時スレッドアクセスによって破損する可能性があります。 Java でスレッドセーフな日付書式設定を行う場合、FastDateFormat はスレッドローカル キャッシュを使用する信頼性の高い代替手段を提供します。
以上がJava の SimpleDateFormat がスレッドセーフではないのはなぜですか? より安全な代替方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。