Je traversais le code source de ArrayblockingQueue et LinkedblockingQueue. LinkedBlockingQueue a un collock et un takelock pour l'insertion et l'enlèvement, respectivement, mais ArrayblockingQueue utilise uniquement 1 verrouillage. Je crois que LinkedBlockingQUEqueur a été implémenté sur la base de la conception décrite dans simple, rapide et pratique Non-blocage et blocage Algorithmes de files d'attente simultanées . Dans cet article, ils mentionnent qu'ils gardent un nœud factice afin que les Enqueusers ne soient jamais obligés d'accéder à la tête et que desquelles ne doivent jamais avoir à accéder à la queue qui évite les scénarios d'impasse. Je me demandais pourquoi ArrayBlockingQueue n'emprunte pas la même idée et utilisez plutôt 2 verrouillons. P>
4 Réponses :
ArrayBlockingQueue doit éviter les entrées écrasantes de manière à savoir où le début et la fin sont. Un LinkedBlockQueue n'a pas besoin de le savoir car il permet au GC s'inquiéter de nettoyer les nœuds dans la file d'attente. P>
Merci de me pointer dans la bonne direction. J'ai de nouveau traversé le code et j'ai constaté que les arrayblockingquingQueue et LinkedBlockingQueue maintiennent une variable "compte". Ceci est atomicinteger dans LinkedBlockingQueue (incrémenté et décrémenté en conséquence dans Met et Retirez) et une INT dans une arrayblockingqueuse. Et je suppose que cela ne peut pas être un atomicinteger dans ArrayBlockingQueue car il doit envelopper.
@Peter Ce serait vraiment très bon si vous pouvez expliquer pourquoi deux algorithmes de la file d'attente de verrouillage ne fonctionneraient pas. Le nombre peut très bien être atomicinteger en cas d'abq et peut être très bien évitée par le nombre de checnking == max_capacité.
@Veritas pouvez-vous expliquer où je mentionne l'algorithme de la file d'attente de deux serrures? J'ai écrit cela il y a deux ans et je ne trouve pas de quoi vous parlez.
Deux file d'attente de verrouillage algo sont utilisées par la mise en œuvre de LBQ. LBQ Prendre et mettre peut travailler simultanément, mais ce n'est pas le cas avec ABQ.SO se demandant pourquoi? C'était aussi la question initiale. Mais ne pouvait pas comprendre la réponse
@Peterlawrey J'ai collé une petite mise en œuvre de l'ABQ en utilisant une approche LBQ. Pouvez-vous indiquer la condition de course Pastebin.com/zd1ufy7s . Merci
Je me demandais pourquoi ArrayblockingQueue ne emprunte pas la même idée et utilisez 2 verrouillons à la place. P> blockQuote>
Parce que le
arrayblockingQueue code> utilise une structure de données beaucoup plus simple pour contenir les éléments de la file d'attente. P>
Le
ArrayBlockingQueue code> stocke ses données dans un
Articles Finale privé e []; Code> Array. Pour les threads multiples pour traiter ce même espace de stockage, que vous ajoutez ou déshabille, ils doivent utiliser le même verrou. Ceci n'est pas seulement à cause de la barrière de la mémoire, mais à cause de la protection mutex, car ils modifient le même tableau. P>
LinkedBlockingQueue code> D'autre part est une liste liée des éléments de file d'attente complètement différents et permet de disposer d'une double serrure. Il s'agit du stockage interne des éléments de la file d'attente qui a permis aux différentes configurations de verrouillage. P>
Je pense que c'est possible pour ABQ d'emprunter la même idée que LBQ. Veuillez vous reporter à mon code http://pastebin.com/zd1ufy7s et une question similaire que j'ai posée sur tellement ArrayBlockingQueue: Mise en concurrence et prendre . p>
La raison pour laquelle ils ne l'ont pas utilisé, est principalement dû à la complexité de la mise en œuvre, en particulier d'itérateurs et de compromis entre la complexité et le gain de performance n'était pas si lucratif. P>
Pour plus de référence, veuillez consulter http://jsr166-concurrency.10961.n7.n.n.n.natabable.com/arrayblockingqueue-concurrent-put-and-take-tc1306.html . P>
2 verrous sont utilisés dans LBQ pour limiter l'accès à la tête et verrouillent simultanément. Le verrouillage de la tête désactive deux éléments d'être retirés simultanément et la serrure de la queue désactive deux éléments d'être ajouté simultanément à la file d'attente. Les deux verrouillons ensemble empêchent les courses. p>
Une réponse plus détaillée liée à cette même question peut être trouvée ici lien