SimpleDateFormat はスレッド セーフでないことが知られており、複数のスレッドが同じインスタンスに同時にアクセスすると潜在的な問題が発生します。この制限の背後にある理由と、スレッドセーフな対応する FastDateFormat との違いを調べてみましょう。
SimpleDateFormat は、Calendar オブジェクトを含むインスタンス変数の内部状態を維持します。複数のスレッドが同じインスタンスにアクセスしようとすると、互いの中間結果を上書きして破損を引き起こす可能性があります。
たとえば、parse メソッドは Calendar オブジェクトを初期化しますが、最初のスレッドが完了する前に別のスレッドが parse を呼び出した場合、カレンダーがリセットされ、最初のスレッドの結果に影響します。
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 がスレッドセーフではないのはなぜですか?また、スレッドセーフな日付形式を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。