Maison  >  Article  >  Java  >  Soyez prudent lorsque vous effectuez des flux parallèles

Soyez prudent lorsque vous effectuez des flux parallèles

王林
王林original
2024-08-23 18:02:36400parcourir

Item  Tenha cuidado ao fazer streams paralelas

Java et Concurrence :

  • Java a toujours été à l'avant-garde de la facilitation de la programmation simultanée, offrant un support natif des threads depuis 1996 et évoluant pour inclure des bibliothèques telles que java.util.concurrent et le framework fork-join.

Flux et parallélisme :

  • Avec l'introduction des flux dans Java 8, il est devenu facile de paralléliser les opérations avec un seul appel à la méthode parallel(). Cependant, même avec cette facilité, l'écriture de programmes simultanés corrects et rapides reste un défi.

Performances et échecs :

  • Une parallélisation négligente des pipelines de flux peut entraîner des échecs de performances et de vivacité (programmes qui ne se terminent pas). Un exemple donné montre que la parallélisation d'un flux peut entraîner une augmentation significative de l'utilisation du processeur sans résultats visibles.

Heuristiques et limites :

  • La parallélisation des flux peut échouer si les heuristiques utilisées pour diviser le travail ne sont pas adaptées, en particulier dans des opérations comme Stream.iterate et limit, où les coûts de calcul des éléments supplémentaires peuvent être très élevés.

Structures de données idéales :
Les flux sur ArrayList, HashMap, HashSet, ConcurrentHashMap, les tableaux et les plages sont de meilleurs candidats pour la parallélisation en raison de la facilité de division du travail entre les threads et de la bonne localité de référence.

Opérations du terminal :

  • L'efficacité de l'exécution parallèle dépend également du fonctionnement du terminal du flux. Les opérations de réduction, telles que réduire, min, max, compte et somme, et les opérations de court-circuit, telles que anyMatch, allMatch et noneMatch, sont meilleures pour le parallélisme.

Spécifications strictes :

  • Les fonctions utilisées dans les pipelines parallèles doivent être associatives, non interférentes et sans état. La violation de ces règles peut entraîner des résultats incorrects ou des échecs catastrophiques.

Ordres d'exécution :

  • La parallélisation d'un pipeline peut encombrer la sortie, et des opérations comme forEachOrdered peuvent être nécessaires pour préserver l'ordre.

Parallélisme justifié :

  • Parallélisez un flux uniquement s'il existe une justification solide. Un parallélisme inadéquat peut entraîner des plantages ou des performances médiocres. Mesurez toujours les performances avant et après la parallélisation pour vous assurer qu'elles sont bénéfiques.

Exemple d'efficacité :

  • Un exemple simple a montré que la parallélisation d'un calcul π(n) réduisait le temps d'exécution de 31 à 9,2 secondes, démontrant que le parallélisme peut être efficace dans certains scénarios.

Utilisation de SplittableRandom :

  • Pour les flux de nombres aléatoires parallèles, préférez SplittableRandom à ThreadLocalRandom ou Random car il est spécialement conçu pour cet usage et offre de meilleures performances.

Conclusion :

  • N'essayez pas de paralléliser un pipeline de flux sans avoir de bonnes raisons de croire que cela préservera la précision des calculs et augmentera la vitesse. Effectuez des tests rigoureux pour vérifier que le parallélisme est justifié avant de l'appliquer au code de production.

EXEMPLES
1. Exemple de flux séquentiel et séquentiel Parallèle

  • Cet exemple démontre la différence de performances entre un flux séquentiel et parallèle. ParallelStreamExample.java

2. Exemple d'utilisation inefficace de parallel()

  • Cet exemple montre comment la parallélisation peut conduire à un comportement inattendu. InefficaceParallelStream.java

3. Exemple d'utilisation efficace de parallel()

  • Cet exemple montre une situation dans laquelle la parallélisation peut réellement améliorer les performances. EfficaceParallelStream,java

4. Exemple de failles de sécurité avec des flux parallèles

  • Cet exemple montre comment une opération de réduction mal implémentée peut échouer lorsqu'elle est utilisée en parallèle. ParallelStreamSafetyExample.java

5. Exemple avec SplittableRandom pour les flux parallèles

  • Cet exemple démontre l'utilisation de SplittableRandom dans un flux parallèle pour obtenir de meilleures performances. SplittableRandomExample.java

Ces exemples permettent d'illustrer des situations dans lesquelles la parallélisation peut être utile et montrent également les risques potentiels liés à l'utilisation inconsidérée de parallel().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn