117 votes

Qu'est-ce qu'un mutex et un sémaphore en Java ? Quelle est la principale différence ?

Qu'est-ce qu'un mutex et un sémaphore en Java ? Quelle est la principale différence ?

0 votes

Requête similaire dans stackoverflow.com/questions/4039899/

146voto

feabhas Points 651

Malheureusement, tout le monde a manqué la différence la plus importante entre le sémaphore et le mutex ; le concept de " propriété ".

Les sémaphores n'ont aucune notion de propriété, ce qui signifie que n'importe quel thread peut libérer un sémaphore (cela peut conduire à de nombreux problèmes en soi mais peut aider à la "détection de mort"). Alors qu'un mutex a le concept de propriété (c'est-à-dire que vous ne pouvez libérer un mutex que vous avez acquis).
La propriété est incroyablement importante pour la programmation sûre des systèmes concurrents. Je recommanderais toujours d'utiliser un mutex de préférence à un sémaphore (mais il y a des implications en termes de performances).

Les mutex peuvent également prendre en charge l'héritage de priorité (ce qui peut aider à résoudre le problème de l'inversion de priorité) et la récursion (ce qui élimine un type de blocage).

Il convient également de préciser qu'il existe des sémaphores "binaires" et des sémaphores "de comptage/généraux". Le sémaphore de Java est un sémaphore de comptage et permet donc d'être initialisé avec une valeur supérieure à un (alors que, comme indiqué, un mutex ne peut avoir qu'un compte conceptuel de un). L'utilité de ceci a été soulignée dans d'autres billets.

Donc pour résumer, à moins que vous n'ayez plusieurs ressources à gérer, je recommanderais toujours le mutex plutôt que le sémaphore.

1 votes

La réponse de Feabhas est assez importante - le mutex vérifie que le thread qui tente de libérer le mutex le possède réellement. Cette question m'a été posée lors d'un entretien et cela vaut la peine d'essayer de s'en souvenir.

118voto

Eric Points 8793

Le sémaphore peut être compté, tandis que le mutex ne peut compter que jusqu'à 1.

Supposons que vous ayez un thread en cours d'exécution qui accepte les connexions des clients. Ce thread peut gérer 10 clients simultanément. Ensuite, chaque nouveau client place le sémaphore jusqu'à ce qu'il atteigne 10. Lorsque le sémaphore a 10 drapeaux, alors votre thread n'acceptera pas de nouvelles connexions.

Les Mutex sont généralement utilisés pour garder des choses. Supposons que vos 10 clients puissent accéder à plusieurs parties du système. Vous pouvez alors protéger une partie du système avec un mutex de sorte que lorsqu'un client est connecté à ce sous-système, personne d'autre n'y a accès. Vous pouvez également utiliser un sémaphore dans ce but. Un mutex est un "Sémaphore d'exclusion mutuelle" .

4 votes

Ce n'est pas tout à fait vrai. Le même thread peut entrer dans le même mutex plus d'une fois, donc un compte doit être maintenu pour s'assurer que les entrées `& sorties sont équilibrées.

1 votes

@finnw, en général il y a deux types de mutex, récursif et non-récursif. Java utilise-t-il par défaut le type récursif ?

2 votes

@edA-qa mort-ora-y, le terme "Mutex" n'est pas utilisé dans la VM Java ou dans les spécifications de l'API. Je suppose donc qu'il fait référence au moniteur intégré à chaque objet, qui est également similaire à l'objet Win32 appelé Mutex. La même chose s'applique à un ReentrantLock . Tous ces éléments sont récursifs. Je n'ai pas connaissance d'exemples "réels" de mutex non récursifs (je ne les ai vus que dans des manuels) et je ne les ai donc pas pris en compte.

41voto

aJ. Points 17014

Mutex est fondamentalement une exclusion mutuelle. Un seul thread peut acquérir la ressource à la fois. Lorsqu'un thread acquiert la ressource, aucun autre thread n'est autorisé à acquérir la ressource jusqu'à ce que le thread propriétaire de la ressource la libère. Tous les threads qui attendent d'acquérir la ressource seront bloqués.

Le sémaphore est utilisé pour contrôler le nombre de threads en cours d'exécution. Il y aura un ensemble fixe de ressources. Le nombre de ressources est décrémenté chaque fois qu'un thread possède la même ressource. Lorsque le nombre de sémaphores atteint 0, aucun autre thread n'est autorisé à acquérir la ressource. Les threads sont bloqués jusqu'à ce que les autres threads possédant la ressource soient libérés.

En bref, la principale différence est combien de fils sont autorisés à acquérir la ressource en même temps ?

  • Mutex -- son UN.
  • Sémaphore -- son DEFINED_COUNT, ( autant que le nombre de sémaphore)

10voto

Jason Coco Points 52303

Un mutex est utilisé pour l'accès en série à une ressource tandis qu'un sémaphore limite l'accès à une ressource jusqu'à un nombre déterminé. Vous pouvez considérer un mutex comme un sémaphore avec un nombre d'accès de 1. Quel que soit le nombre de sémaphores que vous fixez, c'est le nombre de threads qui peuvent accéder à la ressource avant que celle-ci ne soit bloquée.

4voto

andrew pate Points 31

La réponse de Feabhas est assez importante - le mutex vérifie que le thread qui tente de libérer le mutex le possède réellement. Cette question m'a été posée lors d'un entretien et cela vaut la peine d'essayer de s'en souvenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X