Java Language Comment éviter d'avoir à comprendre le modèle de mémoire


Exemple

Le modèle de mémoire est difficile à comprendre et difficile à appliquer. C'est utile si vous avez besoin de raisonner sur l'exactitude du code multi-thread, mais vous ne voulez pas avoir à faire ce raisonnement pour chaque application multithread que vous écrivez.

Si vous adoptez les principes suivants lors de l' écriture du code concurrent en Java, vous pouvez éviter en grande partie la nécessité de recourir à un raisonnement qui se passe-avant.

  • Utilisez des structures de données immuables lorsque cela est possible. Une classe immuable correctement implémentée sera compatible avec les threads et n'introduira pas de problèmes de sécurité des threads lorsque vous l'utiliserez avec d'autres classes.

  • Comprendre et éviter les "publications dangereuses".

  • Utilisez des mutex primitifs ou des objets Lock pour synchroniser l'accès à l'état des objets mutables qui doivent être thread-safe 1 .

  • Utilisez Executor / ExecutorService ou le framework de jointure de fork plutôt que de tenter de créer des threads directement.

  • Utilisez les classes `java.util.concurrent qui fournissent des verrous, des sémaphores, des verrous et des verrous avancés, au lieu d'utiliser directement wait / notify / notifyAll.

  • Utilisez les versions java.util.concurrent de cartes, d'ensembles, de listes, de files d'attente et de deques plutôt que la synchronisation externe de collections non concurrentes.

Le principe général est d'essayer d'utiliser les bibliothèques de concurrence intégrées de Java plutôt que de "déployer votre propre" concurrence. Vous pouvez compter sur leur fonctionnement, si vous les utilisez correctement.


1 - Tous les objets ne doivent pas être thread-safe. Par exemple, si un objet ou des objets sont confinés dans un thread (c’est -à- dire qu’il n’est accessible qu’à un seul thread), sa sécurité de thread n’est pas pertinente.