Pourquoi SimpleDateFormat pose-t-il un problème de sécurité des fils de discussion ?
Introduction
Code Exemple : Démontrer le Problème
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)); } } } } }
Analyse des problèmes
SimpleDateFormat stocke les résultats intermédiaires dans des champs d'instance, ce qui le rend vulnérable à la corruption des données lorsque plusieurs threads utilisent simultanément la même instance. Dans l'exemple de code, plusieurs threads appellent la méthode « format() », ce qui peut entraîner un formatage de l'heure incorrect et des résultats en double en raison de l'état partagé des champs d'instance.
Sécurité des threads dans FastDateFormat
FastDateFormat, contrairement à SimpleDateFormat, utilise une conception thread-safe en évitant les champs d'instance et en utilisant des variables locales de thread pour son instance de calendrier interne. Cela garantit que chaque thread dispose de son propre calendrier dédié, éliminant ainsi le risque de conflits ou de corruption des données.
Alternatives pour une sécurité améliorée des threads
Outre FastDateFormat, des solutions alternatives pour la gestion Le formatage de date thread-safe inclut :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!