Vérouillage des objets

Blockage d'accès aux objets

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Les verrous permettent, dans la plupart de cas, de synchroniser le flux de passage. Les mêmes verrous ont trouvé leur utilité dans le monde des applications Java, dans le package java.util.concurrent. A travers cet article on verra comment.

Verrouillage des objets en Java

On a déjà évoqué une façon de verrouiller les objets en Java : le mot-clé synchronized. Cependant, le package java.util.concurrent en fournit une autre qui est l'interface Lock. Ses implémentations savent gérer un verrouillage et un déverrouillage. Elles peuvent également effectuer des opérations plus sophistiquées, comme par exemple les tentatives de verrouillage pendant un certain temps.

Regardons cela sur l'exemple d'une cabine d'essayage. Trois personnes veulent essayer la même paire des jeans. Cependant, elle est le dernier exemplaire dans le magasin et seulement une personne peut la mesurer simultanément :

afficher le code

Le résultat d'exécution ressemblera toujours à cela :

T1 is trying the jeans
T1 doesn't like the jeans. The next customer can try it
T2 is trying the jeans
T2 doesn't like the jeans. The next customer can try it
T3 is trying the jeans
T3 doesn't like the jeans. The next customer can try it

Comment cela fonctionne ? Au tout début de la méthode run(), le Thread vérifie si l'instance de l'objet partagé (Jeans) est déjà verrouillée (tryLock()). Les deux paramètres signifient que le verrouillage sera tenté pendant 9 secondes. Au bout de ce temps, il passera à else et affichera "can't lock". Dans la partie finally on doit donc placer l'instruction de déverrouillage (unlock()) pour permettre d'accéder et de bloquer l'accès à l'instance à un nouveau Thread.

Il existe également une classe qui accepte la lecture d'une valeur par plusieurs Threads. Mais l'écriture ne peut être effectuée que par un seul Thread. Il s'agit de ReadWriteLock. Cette classe peut améliorer les performances des applications multi thread. Regardons comment elle fonctionne sur un exemple :

afficher le code

Voici le résultat :

afficher le code

Grâce à ce résultat on peut constater qu'effectivement un seul Thread peut écrire de nouvelles informations. En même temps au moins deux (Thread-3 et Thread-5) peuvent lire des informations déjà ajoutées. On constate également que l'opération d'écriture annule tous les verrouillages de lecture.

Bartosz KONIECZNY Concurrence

Une question ? Une remarque ?

*

*

Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil Symfony2

Comment récupérer le SecurityContext dans la vue ?

Dans Symfony2 on peut récupérer le SecurityContext directement dans les templates de vue.

Pour ce faire, utilisez la ligne suivante (s'applique seulement pour les templates PHP) :

$viewUser = $view->container->get('security.context')->getToken();