Qu'est-ce que Java Semaphore et Mutex - Java Concurrency MultiThread expliqué avec l'exemple

Publié: 2015-03-12

Tutoriel Java Mutex et Semaphore par Crunchify

La concurrence Java est un sujet très vaste. Il existe des centaines de tutoriels et d'exemples disponibles à utiliser. Il y a quelque temps, j'ai écrit quelques tutoriels sur Exécuter plusieurs threads simultanément en Java et sur différents types de blocs synchronisés.

Dans ce tutoriel, nous allons passer en revue :

  1. Explication de Mutex
  2. Explication du sémaphore
  3. Deux exemples avec détails

Commençons

Let's keep this in mind en lisant l'explication ci-dessous :

  • Prenons un exemple d'acheteur et de client
  • L'acheteur emprunte des ordinateurs portables
  • Le client peut venir utiliser un ordinateur portable - le client a besoin d'une clé pour utiliser un ordinateur portable
  • Après utilisation - le client peut retourner l'ordinateur portable à l'acheteur

Qu'est-ce que Mutex (juste 1 thread):

L'acheteur a la clé d'un ordinateur portable. Un client peut avoir la clé – emprunter un ordinateur portable – à la fois. Lorsque la tâche est terminée, le client donne (libère) la clé au client suivant dans la file d'attente.

Official Definition :

"Mutex est généralement utilisé pour sérialiser l'accès à une section de re-entrant code qui cannot be executed concurrently par plus d'un thread. Un objet mutex n'autorise qu'un seul thread dans une section contrôlée, forçant les autres threads qui tentent d'accéder à cette section à attendre que le premier thread soit sorti de cette section.

En d'autres termes : Mutex = Mutually Exclusive Semaphore

Qu'est-ce que Semaphore (N threads spécifiés):

Disons maintenant que Shopper a 3 ordinateurs portables identiques et 3 clés identiques. Le sémaphore est le nombre de free identical Laptop keys . Le nombre de sémaphores - le nombre de clés - est défini sur 3 au début (les trois ordinateurs portables sont libres), puis la valeur de comptage est décrémentée au fur et à mesure que le client entre. Si tous les ordinateurs portables sont utilisés, c'est-à-dire qu'il ne reste plus de clés libres pour Ordinateur portable, le nombre de sémaphores est 0. Désormais, lorsque l'un des clients renvoie l'ordinateur portable, le sémaphore est augmenté à 1 (une clé libre) et donné au client suivant dans la file d'attente.

Official Definition : « Un sémaphore restreint le nombre d'utilisateurs simultanés d'une ressource partagée jusqu'à un nombre maximum. Les threads peuvent demander l'accès à la ressource (en décrémentant le sémaphore), et peuvent signaler qu'ils ont fini d'utiliser la ressource (en incrémentant le sémaphore).

Un autre doit lire: Lazy Creation of Singleton ThreadSafe Instance

Exemple-1 : (explication ci-dessous)

Dans le didacticiel ci-dessus CrunchifySemaphoreMutexTutorial.java lorsque CrunchifyProducer ajoute threadName à l'objet crunchifyList linkedList, il peut signaler le sémaphore.

Le CrunchifyConsumer peut alors essayer d'acquérir le sémaphore, il attendra donc que le CrunchifyProducer ait signalé qu'un threadID a été ajouté. Lors de la signalisation d'une donnée ajoutée, l'un des consommateurs sera réveillé et il saura qu'il peut lire un objet crunchifyList. Il peut lire une liste, puis recommencer à essayer d'acquérir sur le sémaphore.

Si, pendant ce temps, le producteur a écrit un autre paquet, il a signalé à nouveau et l'un ou l'autre des consommateurs continuera alors à lire un autre paquet et ainsi de suite…

Autrement dit:

Résultat:

Comment prévenir les conditions de concurrence :

What if you have multiple Consumers? Dans le didacticiel Java ci-dessus, les consommateurs (et non le producteur) doivent verrouiller le tampon lors de la lecture du paquet (mais pas lors de l'acquisition du sémaphore) pour éviter les conditions de concurrence. Dans l'exemple ci-dessous, le producteur verrouille également la liste puisque tout est sur la même JVM.

Exemple-2 :

Résultat: