Grundsätzlich sollten Sie bei Listen vorsichtig sein, aber wenn es um Parallelverarbeitung geht Achten Sie auf Multithreading
Zum Beispiel
Nicht gut.java
private static List<String> list = new ArrayList<>();
private static Consumer<Integer> qwe = v -> list.add(String.format("%s: %s", Instant.now(), v));
public static void main(String[] args) {
IntStream.range(0, 9).boxed().collect(Collectors.toList()).parallelStream().forEach(qwe);
list.forEach(System.out::println);
}
Das Ergebnis ist
null
null
null
2019-11-08T17:37:22.279Z: 7
2019-11-08T17:37:22.313Z: 3
2019-11-08T17:37:22.313Z: 0
2019-11-08T17:37:22.313Z: 4
2019-11-08T17:37:22.313Z: 6
2019-11-08T17:37:22.313Z: 8
Und
2019-11-08T17:37:48.381Z: 7
2019-11-08T17:37:48.381Z: 5
2019-11-08T17:37:48.381Z: 2
2019-11-08T17:37:48.416Z: 0
2019-11-08T17:37:48.416Z: 8
2019-11-08T17:37:48.417Z: 4
2019-11-08T17:37:48.417Z: 3
2019-11-08T17:37:48.417Z: 6
Oder es ist schon durcheinander Was ist null w Ich versuche es gleichzeitig zu tun, wenn ich es zur Liste hinzufüge Ich verstehe nicht gut und ich habe Probleme.
Damit ...
Das ist okay.java
private static List<String> list = Collections.synchronizedList(new ArrayList<>());
private static Consumer<Integer> qwe = v -> list.add(String.format("%s: %s", Instant.now(), v));
public static void main(String[] args) {
IntStream.range(0, 9).boxed().collect(Collectors.toList()).parallelStream().forEachOrdered(qwe);
list.forEach(System.out::println);
}
Verwenden Sie thread-safe synchronizedList Und hinzugefügt mit for Eachordered, um die Bestellung zu arrangieren Lambdas für jeden wird nacheinander ausgeführt, daher ist sysout dasselbe
2019-11-08T17:40:22.228Z: 0
2019-11-08T17:40:22.259Z: 1
2019-11-08T17:40:22.259Z: 2
2019-11-08T17:40:22.260Z: 3
2019-11-08T17:40:22.260Z: 4
2019-11-08T17:40:22.260Z: 5
2019-11-08T17:40:22.260Z: 6
2019-11-08T17:40:22.260Z: 7
2019-11-08T17:40:22.260Z: 8
Es wird es schön machen
Wenn Sie es gleichzeitig ändern, kommt es zu einem Konflikt! Halt! ich meine Ist es in Ordnung, zu einem Thread-sicheren zu wechseln, wenn Sie vorsichtig sind?