6
votes

Est-il préférable de se synchroniser avec des sémaphores ou des moniteurs?

est-il préférable de se synchroniser avec des sémaphores ou des moniteurs?


2 commentaires

Quel est votre problème spécifique qui nécessite une synchronisation?


Généralement, c'est mieux que l'autre, en même temps également pire.


4 Réponses :


16
votes

2 commentaires

Ceci est intéressant en général mais n'est pas directement applicable à Java, et donc légèrement déroutant. Hoare et mesa moniteurs Wha?


Oui, la question a été posée à Java, mais la réponse n'est pas liée à Java.



2
votes

Tout d'abord, vous devez décider de quelle JDK utilisez-vous. La première communiquée Java où uniquement des threads. Depuis le Tiger Java (5.0), de nouvelles classes ont été introduites pour gérer la concurrence. En particulier, un paquet complet a été fourni, le Java.Util.ConCurrent .

Dans mon expérience, j'ai trouvé que les moniteurs sont meilleurs, car ils laissent le code plus propre. De plus, les utiliser, laissez le code plus facile à comprendre . Ils sont généralement mis en œuvre à travers une classe qui implémente l'interface LOCK : Les implémentations les plus célèbres fournies par le JDK sont la classe retrantRantlock , qui définit une serrure générale et la REENTENNETREADWRITELOCK Classe, qui fournit un écrire Lire Lock.

Combien, un verrou est utilisé pour activer / désactiver l'accès à un objet partagé (par exemple une liste d'objets).

A SEMAPHORE est un objet synchronisé utilisé pour coordonner et contrôler les threads (il existe de nombreux synchronisants fournis dans les derniers JDKS, comme sémaphore , cyclicbarrier , CountownLatch et échangeur classes). Par exemple, avec un sémaphore, vous pouvez libérer un nombre fixe de jetons sur votre pool de threads et décidez donc la quantité d'opérations pouvant être exécutées simultanément. Personnellement, je n'aime pas cette approche, car l'utilisation d'une piscine de fil avec des contrats à terme et des verrous entraîne le même résultat de manière plus propre et plus sûre.

Plus d'infos peuvent être trouvés dans ce livre: " Concurrence Java en pratique " et dans ce tutoriel d'IBM: "<< Un href = "http://www.ibm.com/developerworks/java/tatudials/j-concur/" rel = "nofollow"> Concurrence dans JDK 5.0 ". Certains autres exemples peuvent être trouvés ici .


0 commentaires

4
votes

Pour confirmer, par moniteurs Nous voulons dire le bon vieux synchronisé mot-clé.

première question, avez-vous besoin de votre verrou pour avoir un compteur?

  1. Un sémaphore peut avoir un compteur supérieur à un . Si vous avez besoin de protéger N ressources, le sémaphore est le meilleur. Décision facile.
  2. Si vous protectez une seule ressource, il s'agit du cas intéressant où un sémaphore (1) et un moniteur sont également applicables.

    Le L'article de la concurrence J2SE 5.0 donne un excellent conseil ici. Les moniteurs sont limités car:

    • aucun moyen de reculer d'une tentative d'acquisition d'un verrou déjà détenu ou d'abandonner après avoir attendu une période de temps spécifiée ou d'annuler une tentative de verrouillage après une interruption.
    • aucun moyen de modifier la sémantique d'une serrure, par exemple, par rapport à la réentruisance, à la lecture par rapport à la protection en écriture ou à l'équité.
    • La synchronisation est effectuée dans les procédés et les blocs, ce qui limite ainsi l'utilisation du verrouillage strict-structuré. En d'autres termes, vous ne pouvez pas acquérir une serrure dans une méthode et la libérer dans une autre .

      Donc, si l'un de ces éléments est important pour vous - sauvegarder après un délai d'attente est un excellent exemple - ensuite aller avec un sémaphore. Sinon, un moniteur va bien.


0 commentaires

10
votes

Si vous êtes après la minimisation des maux de tête, préférez les moniteurs ( synchronisé blocs / méthodes) sur des sémaphores où que vous soyez un véritable choix d'une primitive verrouillée. Ignorer les discussions académiques de la flexibilité des sémaphores. Vous êtes après la fiabilité, pas de configurabilité, n'est-ce pas?

Il est souvent affirmé que les moniteurs et les sémaphores sont équivalents (peuvent se simuler mutuellement), mais cette équivalence est beaucoup plus abstraite et moins utile que ce n'est Parfois attendus . Toute personne qui peut correctement simuler une avec l'autre n'a besoin de réponse à cette question plus.

Évidemment, les sémaphores sont votre seul choix pratique dans des situations où le nombre de fils à autoriser à saisir simultanément un bloc est supérieur à un. Donc, le véritable concurrent des moniteurs est sémaphores binaires , à savoir celles qui sont initialisées avec un nombre de 1 et seulement celles d'entre eux où vous attendez du même thread qui a finalement déverrouillé le sémaphore. Alors regardons plus près ces situations.

La différence fondamentale entre les moniteurs et les sémaphores binaires est Propriété de thread . Il a une grande conséquence, et c'est la capacité de réentrancement . La réentruisance signifie qu'un fil qui possède déjà une serrure peut l'acquérir à nouveau par opposition à une impasse. C'est une grosse affaire si votre classe a partagé l'état que vous souhaitez simplement protéger dans toutes les méthodes, mais vous ne pouvez pas vous permettre des hypothèses permanentes sur la manière dont ces méthodes s'appellent mutuellement; ou avec des traits de ceinture et d'accolades qui évoluent dans votre schéma de sécurité de thread en général.

Semaphores ne sont jamais réentrants et les moniteurs Java sont toujours réentrants. Si vous devez verrouiller le même objet à partir de nombreux emplacements de code, Les sémaphores sont sujets à des blocages Même dans des scénarios à un seul fileté - et cette limitation des sémaphores n'apporte que dans des scénarios relativement rares où les moniteurs ne sont pas vraiment un Option quand même.

La propriété de thread réduit également le risque d'oublier de verrouiller, d'oublier de déverrouiller, ou d'une activité de filetage des activités de masquage d'un autre fil. Il existe également une différence ergonomique significative dans la syntaxe Java associée.

Avis aussi Cette question < / a>; Bien qu'il utilise une terminologie différente, les meilleures réponses comprennent "mutex" pour signifier un "moniteur" Java.


0 commentaires