est-il préférable de se synchroniser avec des sémaphores ou des moniteurs? P>
4 Réponses :
"mieux" dépend du contexte. Ils sont "tout aussi puissants" selon James McParlane. Je recommande vivement de consulter son blog pour une discussion sur les différences a >. P>
Voici un guide rapide que j'ai trouvé: p>
semaphores strong> p>
Variables de condition forte> p>
Cette information de: http://www.cs.mtu.edu/~hene/nsf-3/e-book/monitor/sema-vs-monitor.html P>
Quelques ressources utiles: p>
attendre () code> ne bloque pas toujours l'appelant (c'est-à-dire lorsque le compteur de sémaphore est supérieur à zéro). LI>
signal () code> libère un thread bloqué, s'il en existe un ou augmente le compteur de sémaphore. Li>
signal () code> libère un thread bloqué, l'appelant et le thread libéré continuent. li>
ul>
attendre () code> bloque toujours l'appelant. Li>
signal () code> libère un fil bloqué, s'il en existe un, ou le signal est perdu comme s'il n'arrive jamais. LI>
Signal () code> libère un thread bloqué, l'appelant donne le moniteur (type HOARE) ou continue (type MESA). Un seul de l'appelant ou du thread publié peut continuer, mais pas tous les deux. Li>
ul>
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.
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 Strong>. P>
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 em>. Ils sont généralement mis en œuvre à travers une classe qui implémente l'interface forte> LOCK STRAND>: Les implémentations les plus célèbres fournies par le JDK sont la classe Combien, un verrou est utilisé pour activer / désactiver l'accès à un objet partagé (par exemple une liste d'objets). P>
A 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 . P>
Pour confirmer, par moniteurs em> Nous voulons dire le bon vieux première question, avez-vous besoin de votre verrou pour avoir un compteur? P>
Le L'article de la concurrence J2SE 5.0 donne un excellent conseil ici. Les moniteurs sont limités car: p>
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. P> synchronisé code> mot-clé. p>
Si vous êtes après la minimisation des maux de tête, préférez les moniteurs forts> ( 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 em> correctement em> simuler une avec l'autre n'a besoin de réponse à cette question plus. P>
É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 forts>, à 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. P>
La différence fondamentale entre les moniteurs et les sémaphores binaires est Semaphores ne sont jamais réentrants et les moniteurs Java sont toujours réentrants. strong> 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. P>
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. P>
synchronisé code> 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? P>
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.