Maison > Java > javaDidacticiel > Pourquoi SimpleDateFormat n'est-il pas Thread-Safe ?

Pourquoi SimpleDateFormat n'est-il pas Thread-Safe ?

Barbara Streisand
Libérer: 2024-12-07 14:40:17
original
895 Les gens l'ont consulté

Why is SimpleDateFormat Not Thread-Safe?

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));
                }
            }
        }
    }
}
Copier après la connexion

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 :

  • Utilisation d'instances locales de thread de SimpleDateFormat dans le thread pools.
  • Utilisation de bibliothèques qui fournissent un formatage datetime thread-safe, telles que Joda-Time DateTimeFormat.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal