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é, écrire des 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, ainsi que les opérations de court-circuit telles que anyMatch, allMatch et noneMatch sont les 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 telles que 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 cette utilisation 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 mise en œuvre 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 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!