web-dev-qa-db-fra.com

Quelle est la différence entre ArrayBlockingQueue et LinkedBlockingQueue

  1. Quels scénarios est-il préférable d'utiliser un ArrayBlockingQueue et quand est-il préférable d'utiliser un LinkedBlockingQueue?
  2. Si la capacité par défaut de LinkedBlockingQueue est égale à MAX Integer, est-il vraiment utile de l'utiliser comme BlockingQueue avec une capacité par défaut?
38
Java_Jack

ArrayBlockingQueue est soutenu par un tableau dont la taille ne changera jamais après sa création. Définition de la capacité sur Integer.MAX_VALUE créerait un grand tableau avec des coûts élevés dans l'espace. ArrayBlockingQueue est toujours borné.

LinkedBlockingQueue crée des nœuds dynamiquement jusqu'à ce que capacity soit atteint. C'est par défaut Integer.MAX_VALUE. L'utilisation d'une telle capacité n'a aucun coût supplémentaire dans l'espace. LinkedBlockingQueue est éventuellement délimité.

23
Fabian Barney

ArrayBlockingQueue<E> et LinkedBlockingQueue<E> sont des implémentations courantes de BlockingQueue<E> interface.

ArrayBlockingQueue est soutenu par array et Queue impose des ordres comme FIFO. la tête de file d'attente est l'élément le plus ancien en termes de temps et la queue de la file d'attente est l'élément le plus jeune. ArrayBlockingQueue est également un tampon limité de taille fixe d'autre part LinkedBlockingQueue est une file d'attente éventuellement limitée construite au-dessus des nœuds liés.

L'argument facultatif du constructeur lié à la capacité sert à empêcher une expansion excessive de la file d'attente car si la capacité n'est pas spécifiée, elle est égale à Integer.MAX_VALUE.

Lire la suite De ici .

Indice de référence: http://www.javacodegeeks.com/2010/09/Java-best-practices-queue-battle-and.html

15
Ankur Lathi

ArrayBlockingQueue:

ArrayBlockingQueue est une file d'attente bloquée bornée qui stocke les éléments en interne dans un tableau. Le fait qu'il soit borné signifie qu'il ne peut pas stocker des quantités illimitées d'éléments. Il y a une limite supérieure sur le nombre d'éléments qu'il peut stocker en même temps. Vous définissez la limite supérieure au moment de l'instanciation, et après cela, elle ne peut pas être modifiée.

LinkedBlockingQueue

Le LinkedBlockingQueue conserve les éléments en interne dans une structure liée (nœuds liés). Cette structure liée peut éventuellement avoir une limite supérieure si vous le souhaitez. Si aucune limite supérieure n'est spécifiée, Integer.MAX_VALUE est utilisé comme limite supérieure.

Similitude

ArrayBlockingQueue/LinkedBlockingQueue stocke les éléments en interne dans l'ordre FIFO (First In, First Out). La tête de la file d'attente est l'élément qui a été dans la file d'attente le plus longtemps et la queue du file d'attente est l'élément qui a été dans la file d'attente le plus court.

Différences

  • LinkedBlockingQueue a respectivement un putLock et un takeLock pour l'insertion et la suppression, mais ArrayBlockingQueue n'utilise qu'un seul verrou.
  • ArrayBlockingQueue utilise un algorithme de double condition à verrou unique et LinkedBlockingQueue est une variante de l'algorithme "file d'attente à deux verrous" et il a 2 verrous 2 conditions (takeLock, putLock).

L'algorithme Two Lock Queue est utilisé par la mise en œuvre de LinkedBlockingQueue. Ainsi, la prise et la mise en place de LinkedBlockingQueue peuvent fonctionner simultanément, mais ce n'est pas le cas avec ArrayBlockingQueue. La raison de l'utilisation d'un seul verrou dans ArrayBlockingQueue est que ArrayBlockingQueue doit éviter d'écraser les entrées afin de savoir où se trouvent le début et la fin. Un LinkedBlockQueue n'a pas besoin de le savoir car il permet au GC de s'inquiéter du nettoyage des nœuds dans la file d'attente.

7
Ramesh Papaganti

L'ajout d'un élément à ArrayBlockingQueue est censé être plus rapide car cela signifie uniquement définir une référence à un élément du tableau d'objets de support, tandis que l'ajout d'un élément à LinkedBlockingQueue signifie créer un Node et définir son élément, En outre, lorsque nous supprimons un élément de LinkedBlockingQueue, le Node devient un déchet qui peut influencer les performances de l'application).

En ce qui concerne la consommation de mémoire, ArrayBlockingQueue contient toujours un tableau d'objets à pleine capacité même lorsqu'il est vide. D'un autre côté, un élément de LinkedBlockingQueue est un Node avec un objet avec 3 champs d'objet.

6
Evgeniy Dorofeev