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