même:
1. LinkedBlockingQueue et ArrayBlockingQueue implémentent tous les deux l'interface BlockingQueue;
2.
Le Reentrantlock et l'état sont utilisés en interne pour assurer la synchronisation de la production et de la consommation;
Lorsque la file d'attente est vide, le fil de consommation est bloqué; Lorsque la file d'attente est pleine, le fil du producteur est bloqué;
Utilisez la méthode de condition pour synchroniser et communiquer: attendre () et signaler ()
différent:
1. Comme le montre l'image ci-dessus, leur mécanisme de verrouillage est différent.
Les serrures de LinkedBlockingQueue sont séparées, le verrou du producteur et le serrure du consommateur Takelock
Les producteurs et les consommateurs ArrayBlockingQueue utilisent le même serrure;
2. Leur mécanisme de mise en œuvre sous-jacent est également différent
LinkedBlockingQueue maintient une structure de liste liée en interne
Pendant la production et la consommation, les objets de nœud doivent être créés pour l'insertion ou la suppression. Dans les systèmes avec de grands lots de données, la pression sur GC sera plus élevée.
ArrayBlockingQueue maintient un tableau en interne
Pendant la production et la consommation, les objets d'énumération sont directement insérés ou supprimés, et aucune instance d'objet supplémentaire n'est générée ou détruite.
3. Différences de construction
LinkedBlockingQueue a une taille de capacité par défaut: Integer.max_value, bien sûr, vous pouvez également passer dans la taille de la capacité spécifiée.
Lors de l'initialisation de ArrayBlockingQueue, une valeur de capacité doit être transmise.
Vous pouvez savoir en regardant la méthode de construction fournie par elle
4. Exécuter la méthode Clear ()
Lorsque LinkedBlockingQueue exécute la méthode Clear, deux verrous seront ajoutés.
5. Statistiques Le nombre d'éléments
Un objet atomicInteger est utilisé dans LinkedBlockingQueue pour compter le nombre d'éléments
ArrayBlockingQueue utilise le type int pour compter les éléments