[JAVA] Utilisez stream pour vérifier que SimpleDateFormat est thread unsafe

introduction

Bonjour. C'est Kecho. ** Utilisez-vous SimpleDateFormat et diffusez-vous? ** ** C'est une niche. J'adore stream. Cette fois, nous vérifierons que SimpleDateFormat est thread unsafe.

Préparation

Tout d'abord, préparez un objet de type Date.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");

Calendar day1 = Calendar.getInstance();
day1.set(2020, 0, 31, 0, 0, 0);
Calendar day2 = Calendar.getInstance();
day2.set(1995, 3, 6, 0, 0, 0);

Mettons-le dans la liste.

for (int i = 0; i < 10; i++) {
	//Pack 20 objets Date dans la liste
	list.add(day1.getTime());
	list.add(day2.getTime());
}

Tout d'abord, procédez sans exécuter en parallèle.

list.stream().map(date -> sdf.format(date)).forEach(System.out::println);
//Convertissez chaque élément en chaîne à son tour et en sortie

L'image entière est ci-dessous.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");

Calendar day1 = Calendar.getInstance();
day1.set(2020, 0, 31, 0, 0, 0);
Calendar day2 = Calendar.getInstance();
day2.set(1995, 3, 6, 0, 0, 0);
List<Date> list = new ArrayList<>(); //Créer une liste

for (int i = 0; i < 10; i++) {
	//Remplissez la liste avec des objets Date
	list.add(day1.getTime());
	list.add(day2.getTime());
}

list.stream().map(date -> sdf.format(date)).forEach(System.out::println);

Exécuter en un seul thread

2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00

Il ne semble y avoir aucun problème.

Exécuter dans plusieurs threads

stream traitera en parallèle simplement en ajoutant parallel () à l'opération intermédiaire.

list.stream().map(date -> sdf.format(date)).forEach(System.out::println);

Faisons le!

2020/01/31 12:00:00
1995/01/31 12:00:00 //Qu'est-ce que c'est ça
1995/04/06 12:00:00
2020/01/31 12:00:00
2020/01/31 12:00:00
2020/01/31 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/31 12:00:00 //Qu'est-ce que c'est ça

Certaines dates inattendues ont été sorties. J'ai pu confirmer qu'il s'agit d'un thread non sécurisé.

Contre-mesures

Vous pouvez créer un objet SimpleDateFormat dans chaque thread. Fondamentalement, il est préférable d'utiliser l'API Date et heure implémentée à partir de Java 8.

Implémentation à l'aide de DateTimeFormatter

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss");

LocalDateTime today = LocalDateTime.now();
LocalDateTime birthDay = LocalDateTime.of(1995, 4, 6, 12, 0, 0);

List<LocalDateTime> list = new ArrayList<>();

for (int i = 0; i < 10; i++) {
	//Remplissez la liste avec des objets Date
	list.add(today);
	list.add(birthDay);
}

list.stream().parallel().map(date -> dtf.format(date)).forEach(System.out::println);
2020/01/31 09:33:20
1995/04/06 12:00:00
1995/04/06 12:00:00
2020/01/31 09:33:20
1995/04/06 12:00:00
2020/01/31 09:33:20
2020/01/31 09:33:20
2020/01/31 09:33:20
2020/01/31 09:33:20
2020/01/31 09:33:20
2020/01/31 09:33:20
1995/04/06 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
2020/01/31 09:33:20
2020/01/31 09:33:20
1995/04/06 12:00:00
1995/04/06 12:00:00

Ça me va.

Résumé

Utiliser l'API de date et d'heure pour Java 8 et supérieur

Recommended Posts

Utilisez stream pour vérifier que SimpleDateFormat est thread unsafe
SimpleDateFormat est thread unsafe
La fonction est très facile à utiliser
Écrire du code difficile à tester
[Rails] Enum est plus facile à utiliser! Énumélisez!
Code difficile à déboguer et à analyser
Écrire du code facile à maintenir (partie 1)
Écrire du code facile à maintenir (partie 4)
Écrire du code facile à maintenir (partie 3)