Java simultanéité: le compte à Rebours loquet vs Cyclique de la barrière
Je lisais le java.util.simultanée de l'API, et a constaté que
CountDownLatch
: Une synchronisation de l'aide qui permet à un ou plusieurs threads d'attendre jusqu'à ce qu'un ensemble d'opérations effectuées dans d'autres threads complète.CyclicBarrier
: Une synchronisation de l'aide qui permet à un ensemble de threads à tous d'attendre les uns des autres, pour arriver à une barrière point.
Pour moi les deux semble égal, mais je suis sûr qu'il ya beaucoup plus à elle.
Par exemple, dans CoundownLatch, the countdown value could not be reset, that can happen in the case of CyclicBarrier
.
Est-il une autre différence entre les deux?
Quelles sont les use cases
où quelqu'un voudrait pour réinitialiser la valeur du compte à rebours?
Les loquets sont en attente pour les événements; les obstacles sont en attente pour les autres threads. - Java de la Simultanéité dans la Pratique, B. Goetz et coll.
OriginalL'auteur daydreamer | 2010-11-12
Vous devez vous connecter pour publier un commentaire.
Une différence importante est que CyclicBarrier prend une (facultatif) Praticable tâche est exécutée une fois l'obstacle commun condition est remplie.
Il vous permet aussi d'obtenir le nombre de clients en attente à la barrière et le nombre requis pour déclencher la barrière. Une fois déclenché, l'obstacle est remise à zéro et peut être utilisé à nouveau.
Pour de simples cas d'utilisation de services de départ etc... un CountdownLatch est très bien. Un CyclicBarrier est utile pour les plus complexes des tâches de coordination. Un exemple d'une telle chose serait de calcul parallèle - où plusieurs sous-tâches sont impliqués dans le calcul, un peu comme des MapReduce.
Lee Merci pour "la barrière est réinitialisé automatiquement dès qu'il est déclenché." donc pas besoin d'appeler reset( ) dans le code.
OriginalL'auteur Jon
Il y a une autre différence.
Lors de l'utilisation d'un
CyclicBarrier
, l'hypothèse est que vous spécifiez le nombre de threads en attente de déclenchement de la barrière. Si vous spécifiez 5, vous devez avoir au moins 5 threads d'appelerawait()
.Lors de l'utilisation d'un
CountDownLatch
, vous spécifiez le nombre d'appels àcountDown()
qui fera en sorte que tous les threads en attente d'être libéré. Cela signifie que vous pouvez utiliser unCountDownLatch
avec un seul thread."Pourquoi voudriez-vous faire cela?", vous pouvez dire. Imaginez que vous êtes à l'aide d'un mystérieux API codé par quelqu'un d'autre qui effectue des rappels. Vous souhaitez qu'un de vos fils d'attendre un certain rappel a été appelé un certain nombre de fois. Vous n'avez aucune idée de qui fils le callback sera appelé. Dans ce cas, un
CountDownLatch
est parfaite, alors que je ne peux pas penser à une façon de mettre en œuvre ce à l'aide d'unCyclicBarrier
(en fait, je peux, mais il implique des délais d'attente... beurk!).Je souhaite juste que
CountDownLatch
pourrait être remis à zéro!Droit - c'est la différence majeure: CountDownLatch-->NumberOfCalls, CyclicBarrier-->NumberOfThreads
Parfait explication!
Je suis d'accord qu'il serait intéressant pour
CountDownLatch
être programmable - une solution de contournement que j'utilise pour mettre en œuvre une rude wait-notify, c'est juste pour nouveau unCountDownLatch
immédiatement lorsque le protégé bloc de code est entré (lorsque le loquet est nul). Ce n'est pas applicable en toutes circonstances/étendues, bien sûr, mais je trouvais ça intéressant de noter que c'est une option de boucle d'or situations.L'une des meilleures réponses sur ce sujet.
Java Concurrency in Practice
- dit la même chose:Latches are for waiting for events; barriers are for waiting for other threads.
. Un premier et un point essentiel de comprendre la différence entre ces deux.OriginalL'auteur Kim
Un point que personne n'a encore mentionné, c'est que, dans un
CyclicBarrier
, si un thread a un problème (délai d'attente, interrompue...), tous les autres qui ont atteintawait()
obtenir une exception. Voir La Javadoc:OriginalL'auteur Chirlo
Je pense que la JavaDoc a expliqué les différences explicitement.
La plupart des gens savent que CountDownLatch ne peut pas être remis à zéro, cependant, CyclicBarrier peut. Mais ce n'est pas la seule différence, ou la CyclicBarrier pourrait être renommé ResetbleCountDownLatch.
Nous devrions dire les différences du point de vue de leurs objectifs, qui sont décrits dans la JavaDoc
CountDownLatch: Une synchronisation de l'aide qui permet à un ou plusieurs threads d'attendre jusqu'à ce qu'un ensemble d'opérations effectuées dans d'autres threads complète.
CyclicBarrier: Une synchronisation de l'aide qui permet à un ensemble de threads à tous d'attendre les uns des autres, pour arriver à une barrière point.
Dans countDownLatch, il y a un ou plusieurs threads en attente d'un ensemble de autres threads pour terminer. Dans cette situation, il existe deux types de threads, un type est en attente, un autre type est en train de faire quelque chose, après les finitions de leurs tâches, ils pourraient être en attente ou tout simplement résilié.
Dans CyclicBarrier, il y a un seul type de fils, ils sont en attente pour l'autre, ils sont égaux.
OriginalL'auteur Justin Civi
La principale différence est documenté à droite dans la Javadoc CountdownLatch. À savoir:
source 1.6 Javadoc
OriginalL'auteur JohnnyO
Cette question a été répondu de manière adéquate déjà, mais je pense que je peux ajouter de la valeur un peu par l'affichage du code.
Pour illustrer le comportement cyclique de la barrière, j'ai fait un exemple de code. Dès que la barrière est à bout, il est automatiquement réinitialiser afin qu'il puisse être utilisé à nouveau (d'où il est "cyclique"). Lorsque vous exécutez le programme, d'observer que les sorties d'impression "Let's play" est déclenché uniquement après la barrière est renversé.
OriginalL'auteur Kevin Lee
Un CountDownLatch est utilisé pour la synchronisation de l'heure. Lors de l'utilisation d'un CountDownLatch, n'importe quel thread est autorisé à suivre le compte à rebours() autant de fois qu'ils le souhaitent. Fils appelé await() sont bloqués jusqu'à ce que le compte à rebours atteint zéro, à cause des appels à compte à rebours() par d'autres débloqué threads. Le javadoc pour CountDownLatch états:
En revanche, cyclique, la barrière est utilisée pour plusieurs martiens points, par exemple, si un ensemble de threads sont en cours d'exécution d'une boucle/progressive de calcul et de besoin de synchroniser avant de commencer la prochaine itération/phase. Comme par le javadoc pour CyclicBarrier:
Contrairement à la CountDownLatch, chaque appel à await() appartient à une phase et le fil de bloquer jusqu'à ce que toutes les parties appartenant à cette phase ont invoqué await(). Il n'est pas explicite, compte à rebours() de l'opération pris en charge par le CyclicBarrier.
OriginalL'auteur shams
Lorsque j'étais étudiant sur les Loquets et cyclicbarriers je suis venu avec cette métaphores.
cyclicbarriers: Imaginez une société dispose d'une salle de réunion. Afin de commencer la réunion, un certain nombre de participants à la réunion ont à venir à la réunion (pour le rendre officiel). le code suivant est celui d'un participant de la réunion (un employé)
employé se joint à la réunion, attend que les autres viennent pour démarrer la réunion. aussi, il obtient quitté si la réunion sera annulé 🙂 ensuite, nous avons LE PATRON comment les doses aime pas attendre pour d'autres personnes à se montrer et si il perd son patient, il annule la réunion.
Sur une journée normale, employé de venir à la rencontre d'attendre les autres pour se montrer et si certains participants ne viennent pas, ils doivent attendre indéfiniment! dans certains réunion spéciale le patron arrive et il n'aime pas attendre.(5 personnes ont besoin pour démarrer la réunion, mais seulement patron arrive et aussi un passionné de l'employé) afin qu'il annule la réunion (en colère)
De sortie:
Il y a un autre scénario dans lequel un autre outsider thread (un tremblement de terre) annule la réunion (appel de méthode reset). dans ce cas, tous les threads en attente êtes réveillé par une exception.
l'exécution de code entraînera dans de drôles de sortie:
Vous pouvez également ajouter un secrétaire à la salle de réunion, si une réunion a eu lieu, elle permettra de documenter chaque chose, mais elle n'est pas une partie de la réunion:
Loquets: si la colère patron veut organiser une exposition pour la société, les clients, chaque chose doit être prêt (ressources). nous fournissons une liste de choses à faire chaque travailleur (Thread), la dose de son travail et nous vérifions la liste de choses à faire (certains travailleurs pour faire de la peinture, d'autres préparent des sound system ...). lorsque tous les éléments dans la liste "à faire" (ressources), nous pouvons ouvrir les portes aux clients.
Et les travailleurs comment la préparation de l'exposition:
OriginalL'auteur Mr.Q
En un mot, juste pour comprendre les principaux fonctionnelle différences entre les deux :
et
à l'exception, bien sûr, les fonctionnalités, comme la non-blocage, la temporisation d'attente, de diagnostic et de tout ce qui a été expliqué dans les détails dans les réponses ci-dessus.
Les classes ci-dessus sont, toutefois, entièrement fonctionnel et équivalent, au sein de la fonctionnalité fournie, à leur correspondant homonymes.
Sur une note différente,
CountDownLatch
'intérieur de la classe de sous-classesAQS
, tandis queCyclicBarrier
utiliseReentrantLock
(je soupçonne qu'il pourrait être l'inverse, ou les deux, pourraient utiliser l'AQS, ou les deux, l'utilisation de Lock-sans aucune perte de performances, efficacité)OriginalL'auteur igor.zh
Dans le cas de CyclicBarrier, dès que TOUS les threads enfants commence l'appel de la barrière.await(), l'Exécutable est lancé dans la Barrière. La barrière.vous attendent dans chaque enfant thread va prendre différentes longueur de temps à la fin, et ils finissent tous en même temps.
OriginalL'auteur Brandon
Une différence évidente est, que N threads peut attendre sur un CyclicBarrier de N pour être release en un seul cycle. Mais illimité, nombre de threads peut attendre sur un CountDownLatch de N. Le compte à rebours de décrémentation peut être fait par un seul thread N fois ou threads N un temps de chaque ou de combinaisons.
OriginalL'auteur Pramma
Dans CountDownLatch, threads principaux attend les autres threads pour achever leur exécution. Dans CyclicBarrier, threads attendre les uns des autres pour compléter leur exécution.
Vous ne pouvez pas réutiliser les mêmes CountDownLatch exemple une fois le compte à rebours atteint zéro et le verrou est ouvert, sur l'autre main CyclicBarrier peuvent être réutilisés par la réinitialisation de la Barrière, une Fois la barrière est cassée.
OriginalL'auteur V Jo
CountDownLatch est un compte à rebours de rien; CyclicBarrier est un compte à rebours pour fil
supposons qu'il y ait 5 threads de travail et un expéditeur fil, et lorsque les travailleurs de produire de 100 articles, l'expéditeur sera expédier.
Pour CountDownLatch, le compteur peut être sur les travailleurs ou les éléments
Pour CyclicBarrier, le compteur peut uniquement sur les travailleurs
Si un travailleur tombe infini sommeil, avec CountDownLatch sur les éléments, l'Expéditeur peut expédier; Cependant, avec CyclicBarrier, l'Expéditeur ne peut jamais être appelée
OriginalL'auteur yk42b
@Kevin Lee et @Jon, j'ai essayé CyclicBarrier avec l'Option Praticable. Dirait qu'il s'exécute dans le début et après la CyclicBarrier est renversé. Voici le code de sortie et de
statique CyclicBarrier barrière;
Sortie
OriginalL'auteur Hari Rao