Vous devez fondamentalement faire attention aux listes, mais en ce qui concerne le traitement parallèle Attention au multi-threading
Par exemple
Pas bien.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);
}
Le résultat de ceci est
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
Et
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
Ou c'est déjà foiré Qu'est-ce que nul w Essayer de le faire en même temps lors de l'ajout à la liste Je ne comprends pas bien et j'ai des problèmes.
Alors ...
C'est d'accord.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);
}
Utiliser synchronizedList thread-safe Et ajouté en utilisant pour Eachordered pour organiser la commande Lambda pour Each est effectué en séquence, donc sysout est le même
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
Cela le fera magnifiquement
Si vous le changez en même temps, il y aura un conflit! Arrêtez! je veux dire Est-il correct de passer à un thread-safe si vous faites attention?