Question

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

Était-ce utile?

La solution

Sémaphore peut être compté, alors que mutex ne peut compter que 1.

Supposons que vous avez un fonctionnement de fil qui accepte les connexions client. Ce fil peut gérer 10 clients simultanément. Ensuite, chaque nouveau client définit le sémaphores jusqu'à ce qu'il atteigne 10. Lorsque le Sémaphore a 10 drapeaux, votre fil ne sera pas accepter de nouvelles connexions

Mutex sont généralement utilisés pour garder des choses. Supposons que vos 10 clients peuvent accéder à plusieurs parties du système. Ensuite, vous pouvez protéger une partie du système avec un mutex alors quand 1 client est connecté à ce sous-système, personne d'autre ne devrait y avoir accès. Vous pouvez utiliser un Sémaphore à cette fin aussi. Un mutex est un .

Autres conseils

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

Les sémaphores ont aucune notion de propriété, cela signifie que tout thread peut libérer un sémaphores (cela peut conduire à de nombreux problèmes en soi, mais peut aider à « la détection de la mort »). Alors qu'un mutex a le concept de propriété (à savoir que vous ne pouvez libérer un mutex que vous avez acquis).
La propriété est extrêmement important pour la programmation en toute sécurité des systèmes concurrents. Je recommande toujours l'utilisation mutex de préférence à un sémaphores (mais il y a des implications sur les performances).

mutex peut également prendre en charge l'héritage de priorité (ce qui peut aider le problème d'inversion de priorité) et récursion (éliminant un type de blocage).

Il convient également de souligner qu'il ya des sémaphores et « comptage / général » sémaphores « binaires ». Le sémaphores de Java est une sémaphores de comptage et permet ainsi d'être initialisé avec une valeur supérieure à un (alors que, comme l'a souligné, un mutex ne peut un nombre théorique d'un). L'utilité de ce qui a été fait dans d'autres postes.

Donc, pour résumer, à moins que vous avez plusieurs ressources pour gérer, je recommande toujours le mutex sur la sémaphores.

Mutex est fondamentalement exclusion mutuelle. Un seul thread peut acquérir la ressource à la fois. Lorsqu'un thread acquiert la ressource, aucun autre thread est autorisé à acquérir la ressource jusqu'à ce que le thread possédant les versions de ressources. Tous les sujets d'attente pour l'acquisition de ressources seraient bloqués.

Sémaphore est utilisé pour contrôler le nombre de threads d'exécution. Il sera fixé un ensemble de ressources. Le nombre de ressources volonté se décrémenté chaque fois que lorsqu'un thread possède le même. Lorsque le nombre de sémaphores atteint 0 alors aucun autre fils sont autorisés à acquérir la ressource. Les fils sont bloqués jusqu'à ce que d'autres threads possédant les rejets de ressources.

En bref, la principale différence est combien de threads sont autorisés à acquérir la ressource à la fois?

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

Un mutex est utilisé pour l'accès à une ressource série alors qu'une limite sémaphores l'accès à une ressource à un numéro de série. Vous pouvez penser à un mutex comme sémaphores avec un nombre d'accès 1. Tout ce que vous définissez votre sémaphores comte, que les threads peuvent peuvent accéder à la ressource avant que la ressource est bloquée.

Un sémaphore est un mécanisme de synchronisation de comptage, un mutex est pas.

Un mutex est souvent connu comme un sémaphore binaire. Alors qu'un sémaphore peut être créé avec un non-zéro compter un mutex est conceptuellement un semeaphore avec un nombre supérieur de 1.

Mutex est binaire sémaphores. Il doit être initialisé avec 1, de sorte que le premier arrivé, premier servi principe est respecté. Cela nous amène à l'autre propriété particulière de chaque mutex: celui qui a fait bas , doit être celui qui fait up . Ergo, nous avons obtenu l'exclusion mutuelle sur certaines ressources.

Maintenant, il était évident que mutex est un cas particulier de Semaphore général.

L'objet de la synchronisation Sémaphore met en œuvre un feu de circulation classique. Un contrôle des feux de circulation l'accès à une ressource partagée par un compteur. Si le compteur est supérieur à zéro, l'accès est accordé; Si elle est égale à zéro, l'accès est refusé. Le compteur compte les autorisations qui permettent d'accéder à la ressource partagée. Ensuite, pour accéder à la ressource, un fil doit obtenir la permission de la lumière de la circulation. En général, d'utiliser un feu de circulation, le fil qui veut accéder à la ressource partagée tente d'obtenir un permis. Si le nombre de feux de circulation est supérieur à zéro, le fil acquiert un permis, et le nombre de feux de circulation est décrémenté. Sinon, le fil est verrouillé jusqu'à ce qu'il puisse obtenir une autorisation. Lorsque le thread n'a plus besoin d'accéder à la ressource partagée, il libère l'autorisation, de sorte que le nombre de feux de circulation augmente. S'il y a un autre thread en attente d'un permis, il acquiert un permis à ce moment-là. La classe Sémaphore de Java implémente ce mécanisme.

Sémaphore a deux constructeurs:

Semaphore(int num)
Semaphore(int num, boolean come)

num spécifie le nombre initial du permis. Ensuite num indique le nombre de threads qui peuvent accéder à une ressource partagée à un moment donné. Si nombre est un, il peut accéder à la ressource un fil à la fois. En réglant venez comme vrai, vous pouvez garantir que les fils que vous attendez ont obtenu l'autorisation dans l'ordre demandé.

Sémaphore :

  

Un sémaphore de comptage. Conceptuellement, un sémaphores maintient un ensemble de permis. Chaque blocs acquire() si nécessaire jusqu'à ce qu'un permis est disponible, puis prend. Chaque release() ajoute un permis, libérant potentiellement un acquéreur de blocage. Toutefois, aucun objet de permis réels sont utilisés; Sémaphore garde juste un décompte du nombre disponible et agit en conséquence.

Les sémaphores sont souvent utilisés pour limiter le nombre de threads que peut accéder à certains (physique ou logique) ressource

Java ne pas API Mutex intégré. Mais il peut être mis en œuvre sémaphores binaire.

  

A sémaphores initialisées à un, et qui est utilisé tel qu'il a seulement au plus un permis disponible, peut servir de verrou d'exclusion mutuelle. Ceci est plus communément connu comme un sémaphore binaire, car il n'a que deux états: un permis disponibles, ou zéro permis disponibles.

Lorsqu'il est utilisé de cette manière, le sémaphore binaire a la propriété (contrairement à beaucoup d'implémentations de verrouillage), que le peut être libéré « verrouiller » par un fil autre que le propriétaire (comme sémaphores ont aucune notion de propriété) . Cela peut être utile dans certains contextes spécialisés, comme la récupération de l'impasse.

différences clés entre Sémaphore et Mutex:

  1. Sémaphore limite nombre de threads d'accéder à un permis de throuhg des ressources. Mutex permet à un seul fil de ressource d'accès.

  2. Aucun fils Sémaphore est propriétaire. Les threads peuvent mettre à jour nombre de permis en appelant des méthodes de acquire() et release(). Les mutex doivent être déverrouillés que par le fil en maintenant le verrou.

  3. Quand un mutex est utilisé avec les variables de condition, il y a une bracketing-il implicite est clair quelle partie du programme est en cours de protecte d. Ce n'est pas nécessairement le cas pour un sémaphores, ce qui pourrait être appelé aller à la programmation concurrente -c'est puissant mais aussi facile à utiliser de façon non structurée, indéterminée.

Vous comparez l'incomparable, techniquement, il n'y a pas de différence entre un Sémaphore et mutex il n'a pas de sens. Mutex est juste un nom significatif comme un nom dans votre logique d'application, cela signifie que vous initialisez un sémaphores à « 1 », il est généralement utilisé pour protéger une ressource ou une variable protégée pour assurer l'exclusion mutuelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top