[JAVA] Liste thread-safe

J'ai peur du traitement parallèle

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

En un mot

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?

Recommended Posts

Liste thread-safe
Méthode de liste
Liste de travail
Liste de liens
Liste des options de séléniure
Mémorandum Java (liste)
Clonez la liste Java.
[Swift] Liste de capture
Tableau / liste / carte