[JAVA] Verwenden Sie stream, um zu überprüfen, ob SimpleDateFormat threadsicher ist

Einführung

Hallo. Es ist Kecho. ** Verwendet ihr SimpleDateFormat und Stream? ** **. Es ist eine Nische. Ich liebe Stream. Dieses Mal werden wir überprüfen, ob SimpleDateFormat Thread-unsicher ist.

Vorbereitung

Bereiten Sie zunächst ein Objekt vom Typ Datum vor.

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);

Lassen Sie es uns in die Liste aufnehmen.

for (int i = 0; i < 10; i++) {
	//Pack 20 Datumsobjekte in die Liste
	list.add(day1.getTime());
	list.add(day2.getTime());
}

Erstens, ohne parallel auszuführen.

list.stream().map(date -> sdf.format(date)).forEach(System.out::println);
//Konvertieren Sie jedes Element nacheinander in String und geben Sie es aus

Das ganze Bild ist unten.

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<>(); //Liste erstellen

for (int i = 0; i < 10; i++) {
	//Füllen Sie die Liste mit Datumsobjekten
	list.add(day1.getTime());
	list.add(day2.getTime());
}

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

In einem Thread ausführen

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

Es scheint kein Problem zu geben.

In mehreren Threads ausführen

Der Stream wird parallel verarbeitet, indem der Zwischenoperation parallel () hinzugefügt wird.

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

Machen wir das!

2020/01/31 12:00:00
1995/01/31 12:00:00 //was ist das
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 //was ist das

Einige unerwartete Daten wurden ausgegeben. Ich konnte bestätigen, dass der Thread unsicher ist.

Gegenmaßnahmen

Sie können in jedem Thread ein SimpleDateFormat-Objekt erstellen. Grundsätzlich ist es besser, die von Java 8 implementierte Datums- und Uhrzeit-API zu verwenden.

Implementierung mit 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++) {
	//Füllen Sie die Liste mit Datumsobjekten
	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

Klingt okay.

Zusammenfassung

Verwenden Sie die Datums- und Uhrzeit-API für Java 8 und höher

Recommended Posts

Verwenden Sie stream, um zu überprüfen, ob SimpleDateFormat threadsicher ist
SimpleDateFormat ist Thread unsicher
Die Funktion ist sehr einfach zu bedienen
Schreiben Sie Code, der schwer zu testen ist
[Rails] Enum ist einfacher zu bedienen! Enumelize!
Code, der schwer zu debuggen und zu analysieren ist
Schreiben Sie einfach zu wartenden Code (Teil 1)
Schreiben Sie einfach zu pflegenden Code (Teil 4)
Schreiben Sie einfach zu wartenden Code (Teil 3)