View on GitHub

club-lecture

En cours de redaction

Chapitre 13 - Concurrence

Idée de la concurrence : Stratégie de découplage entre les actions réalisées et le moment où elles sont réalisées. Le fait d’avoir plusieurs piles sémantiques (plusieurs “programmes”) avec une part de mémoire partagée permet d’effectuer des tâches différentes potentiellement en même temps. On peut avoir des systèmes ou plusieurs programmes coopèrent à résoudre une tâche plus globale. On peut gagner en organisation ou encore en performances.

“Il est difficile, même très difficile, d’écrire des programmes concurrents propres.”

“en apparence, semble parfait, mais qui soit défectueux à un niveau plus profond.”

Raisons de la concurrence

Mythes et idées fausses

Faux :

Vrai :

Se prémunir des problèmes de concurrence

Principe de responsabilité unique

Corollaire : limiter la portée des données

Avoir un maximum de localité pour les données évite d’augmenter la quantité de code susceptible de créer des problèmes de concurrence. Les données accessibles à un thread ne doivent être (logiquement) accessibles par personne excepté le thread, sauf pour les structures de données concurrentes qui doivent renforcer une telle encapsulation.

utiliser le mot-clé synchronized pour protéger une section critique du code qui utilise l’objet partagé

risques :

Corollaire : utiliser des copies des données

A l’entrée des structures concurrentes, forcer la copie permet d’empêcher un thread externe de créer un partage non voulu.

Corollaire : les threads doivent être aussi indépendants que possible

Connaître la bibliothèque

Collections sûres vis-à-vis des threads

Concurrent Programming in Java [Lea99] et “java.util.concurrent”

autres : ReentrantLock, Semaphore, CountDownLatch

Connaître les modèles d’exécution

Producteur-consommateur

https://fr.wikipedia.org/wiki/Probl%C3%A8me_des_producteurs_et_des_consommateurs

Lecteurs-rédacteurs

https://fr.wikipedia.org/wiki/Probl%C3%A8me_des_lecteurs_et_des_r%C3%A9dacteurs

Dîner des philosophes

https://fr.wikipedia.org/wiki/D%C3%AEner_des_philosophes

Attention aux dépendances entre des méthodes synchronisées

Recommandation : évitez d’utiliser plusieurs méthodes sur un objet partagé.

Garder des sections synchronisées courtes

Recommandation : conservez des sections synchronisées les plus courtes possible. Cela permet entre autre d’avoir un code concurrent plus simple (car moins long à lire et comprendre) mais surtout d’éviter de bloquer tout le monde pendant trop longtemps ce qui ruine les performances.

Écrire du code d’arrêt est difficile

Il existe un risque important qu’un thread soit en attente de quelque chose et qu’il ne reçoive jamais le signale d’arrêt.

Tester du code multithread

Il est peu réaliste de vouloir prouver que du code est correct. # Kass’peuk

Questions

Java vs C++