web-dev-qa-db-fra.com

Sémaphore binaire vs un verrou réentrant

J'ai essayé de comprendre les verrous réentrants et les sémaphores (l'imbrication des verrous réentrants vs le mécanisme de libération/déverrouillage).

Il semble qu'avoir un sémaphore vous oblige à écrire une application testée plus en profondeur car la méthode release () ne vérifie pas si le thread libérant l'autorisation le détient réellement. Lorsque j'ai testé mon code de test, j'ai découvert que cela pouvait par la suite augmenter le nombre de permis au-delà de la limite initiale. D'un autre côté, si un thread ne détient pas de verrou rentrant lorsqu'il invoque la méthode de déverrouillage, nous obtenons une exception IllegalMonitorException.

Il serait donc juste de dire qu'il n'y a jamais vraiment de raison d'avoir un sémaphore binaire car tout ce qu'un sémaphore binaire peut faire peut aussi être fait par un ReentrantLock. Si nous utilisons des sémaphores binaires, nous devrons vérifier la pile complète d'appels de méthode pour voir si un permis a été acquis auparavant (il a également été publié également s'il existe une possibilité d'acquisition ultérieure - qui pourrait bloquer si une version ne se déroule pas et bientôt ). De plus, comme les verrous réentrants fournissent également un verrou par objet, n'est-ce pas toujours une meilleure idée de préférer un verrou réentrant à un sémaphore binaire?

J'ai vérifié un article ici qui parle de la différence entre un sémaphore binaire et un mutex, mais y a-t-il quelque chose comme un mutex en Java?

Merci, Chan.

PS - J'avais posté cette question dans un autre forum ( http://www.coderanch.com/t/615796/threads/Java/reason-prefer-binary-Semaphore-Reentrant ) et je n'ai pas '' t reçu une réponse pour le moment. Je pensais que je le posterais ici aussi pour voir ce que je peux obtenir.

32
Chan

il n'y a jamais vraiment de raison d'avoir un sémaphore binaire car tout ce qu'un sémaphore binaire peut faire peut aussi être fait par un ReentrantLock

Si tout ce dont vous avez besoin est une exclusion mutuelle réentrante, alors oui, il n'y a aucune raison d'utiliser un sémaphore binaire sur un ReentrantLock. Si, pour une raison quelconque, vous avez besoin d'une sémantique sans libération de propriété, le sémaphore est évidemment votre seul choix.

De plus, comme les verrous réentrants fournissent également un verrou par objet, n'est-ce pas toujours une meilleure idée de préférer un verrou réentrant à un sémaphore binaire?

Cela dépend du besoin. Comme expliqué précédemment, si vous avez besoin d'un simple mutex, ne choisissez pas de sémaphore. Si plusieurs threads (mais un nombre limité) peuvent entrer dans une section critique, vous pouvez le faire via le confinement de threads ou un sémaphore.

J'ai vérifié un article ici qui parle de la différence entre un sémaphore binaire et un mutex, mais y a-t-il quelque chose comme un mutex en Java?

ReentrantLock et synchronized sont des exemples de mutex en Java.

33
John Vint

Je n'expliquerai pas les verrous rentrants car John a déjà donné une bonne explication ci-dessus et c'est un exemple de mutex dans Java avec le mot-clé Synchronized.

Cependant, si pour une raison quelconque, vous souhaitez avoir un meilleur contrôle sur le mécanisme de verrouillage, Semaphore peut devenir pratique. Cela signifie que votre code devra rester en charge de qui a appelé acquisitions () et qui a appelé libération (), car Sémaphore par nature est aveugle, tout ce qui lui importe est que le permis devienne disponible.

Une autre approche de votre propre implémentation de mutex utilisant Java est LockSupport. Il fonctionne un peu comme Sémaphore mais a un délai d'expiration sur le permis, en utilisant la fonction park () et ne prend en charge qu'un seul permis à la fois contrairement aux sémaphores qui en supportent plusieurs.

7
Ashley

Il existe quelques petites différences entre le sémaphore et le verrou rentrant.

  • Semaphore peut être publié par un autre thread. Le javadoc de Semaphore déclare qu'un tel comportement peut être utile dans certains contextes spécialisés comme la récupération de blocage. Ce devrait donc être un contexte vraiment spécialisé.
  • Les sémaphores binaires ne sont pas non plus rentrants. Vous ne pouvez pas acquérir un sémaphore binaire une deuxième fois dans un même thread. Cela conduira à un blocage (thread de blocage avec lui-même!) Et vous devrez peut-être certains moyens de récupération de blocage déjà mentionnés
0
Ramesh Papaganti