Programmation concurrente en Java

Retourner à la fiche du livre

Visitez le site de la version américaine de l'ouvrage :
www.javaconcurrencyinpractice.com

Codes sources Listings (III & IV)

Parties I & II

III Vivacité, performances et tests

10 Éviter les problèmes de vivacité
10.1 Interblocage simple lié à l'ordre du verrouillage. Ne le faites pas
10.2 Interblocage dynamique lié à l'ordre du verrouillage. Ne le faites pas
10.3 Induire un ordre de verrouillage pour éviter les interblocages
10.4 Boucle provoquant un interblocage dans une situation normale
10.5 Interblocage lié à l'ordre du verrouillage entre des objets coopératifs. Ne le faites pas
10.6 Utilisation d'appels ouverts pour éviter l'interblocage entre des objets coopératifs
10.7 Portion d'une trace de thread après un interblocage

11 Performances et adaptabilité
11.1 Accès séquentiel à une file d'attente
11.2 Synchronisation inutile. Ne le faites pas
11.3 Candidat à l'élision de verrou
11.4 Détention d'un verrou plus longtemps que nécessaire
11.5 Réduction de la durée du verrouillage
11.6 Candidat au découpage du verrou
11.7 Modification de ServerStatus pour utiliser des verrous divisés
11.8 Hachage utilisant le découpage du verrouillage

12 Tests des programmes concurrents
12.1 Tampon borné utilisant la classe Semaphore
12.2 Tests unitaires de base pour BoundedBuffer
12.3 Test du blocage et de la réponse à une interruption
12.4 Générateur de nombre aléatoire de qualité moyenne mais suffisante pour les tests
12.5 Programme de test producteur-consommateur pour BoundedBuffer
12.6 Classes producteur et consommateur utilisées dans PutTakeTest
12.7 Test des fuites de ressources
12.8 Fabrique de threads pour tester ThreadPoolExecutor
12.9 Méthode de test pour vérifier l'expansion du pool de threads
12.10 Utilisation de Thread.yield() pour produire plus d'entrelacements
12.11 Mesure du temps à l'aide d'une barrière
12.12 Test avec mesure du temps à l'aide d'une barrière
12.13 Programme pilote pour TimedPutTakeTest

 

IV Sujets avancés

13 Verrous explicites
13.1 Interface Lock
13.2 Protection de l'état d'un objet avec ReentrantLock
13.3 Utilisation de tryLock() pour éviter les interblocages dus à l'ordre des verrouillages
13.4 Verrouillage avec temps imparti
13.5 Prise de verrou interruptible
13.6 Interface ReadWriteLock
13.7 Enveloppe d’un Map avec un verrou de lecture-écriture

14 Construction de synchronisateurs personnalisés
14.1 Structure des actions bloquantes en fonction de l’état
14.2 Classe de base pour les implémentations de tampons bornés
14.3 Tampon borné qui se dérobe lorsque les préconditions ne sont pas vérifiées
14.4 Code client pour l’appel de GrumpyBoundedBuffer
14.5 Tampon borné avec blocage brutal
14.6 Tampon borné utilisant des files d’attente de condition
14.7 Forme canonique des méthodes dépendantes de l’état
14.8 Utilisation d’une notification conditionnelle dans BoundedBuffer.put()
14.9 Porte refermable à l’aide de wait() et notifyAll()
14.10 Interface Condition
14.11 Tampon borné utilisant des variables conditions explicites
14.12 Semaphore implémenté à partir de Lock
14.13 Formes canoniques de l’acquisition et de la libération avec AQS
14.14 Loquet binaire utilisant AbstractQueuedSynchronizer
14.15 Implémentation de tryAcquire() pour un ReentrantLock non équitable (voir source JDK)
14.16 Les méthodes tryAcquireShared() et tryReleaseShared() de Semaphore (voir source JDK)

15 Variables atomiques et synchronisation non bloquante
15.1 Simulation de l’opération CAS
15.2 Compteur non bloquant utilisant l’instruction CAS
15.3 Préservation des invariants multivariables avec CAS
15.4 Générateur de nombres pseudo-aléatoires avec ReentrantLock
15.5 Générateur de nombres pseudo-aléatoires avec AtomicInteger
15.6 Pile non bloquante utilisant l’algorithme de Treiber (Treiber, 1986)
15.7 Insertion dans l’algorithme non bloquant de Michael-Scott (Michael et Scott, 1996)
15.8 Utilisation de modificateurs atomiques de champs dans ConcurrentLinkedQueue

16 Le modèle mémoire de Java
16.1 Programme mal synchronisé pouvant produire des résultats surprenants. Ne le faites pas
16.2 Classe interne de FutureTask illustrant une mise à profit de la synchronisation
16.3 Initialisation paresseuse incorrecte. Ne le faites pas
16.4 Initialisation paresseuse thread-safe
16.5 Initialisation impatiente
16.6 Idiome de la classe conteneur de l’initialisation paresseuse
16.7 Antipatron du verrouillage vérifié deux fois. Ne le faites pas
16.8 Initialisation sûre pour les objets non modifiables

Haut de page

Codes Annexe - annotations


Retourner à la fiche du livre