Gleichzeitige Warteschlangenimplementierung in Java

Muhammad Zeeshan 12 Oktober 2023
  1. Gleichzeitige Warteschlangen in Java
  2. Beste Warteschlange zum Implementieren in Java
Gleichzeitige Warteschlangenimplementierung in Java

In diesem Artikel werden einige der effektivsten Implementierungen gleichzeitiger Warteschlangen in Java erörtert und welche verwendet werden müssen.

Gleichzeitige Warteschlangen in Java

Lassen Sie uns zunächst alle drei Warteschlangen besprechen.

Java ConcurrentLinkedQueue

In die ConcurrentLinkedQueue ist keine Sperrfunktion eingebaut. Als direktes Ergebnis davon bietet es eine wartefreie Technik, bei der sowohl Add als auch Poll garantiert Thread-sicher sind und umgehend zurückkehren.

Wenn unser Kunde in einer ewigen Schleife wartet, müssen wir unabhängig von der gewählten Option eine blockierende Warteschlange als beste Alternative auswählen. Außerdem kann das wartefreie Verfahren verwendet werden, ohne andere Threads zu blockieren.

CAS oder Compare-and-Swap wird verwendet, anstatt Sperren in dieser Warteschlange. Es ist eine ausgezeichnete Wahl für moderne reaktive Systeme, da diese Systeme die Verwendung von blockierenden Datenstrukturen nicht zulassen und durch die Verwendung dieser Methode sehr viel gewinnen würden.

Java ArrayBlockingQueue

Intern verwendet diese Warteschlange ein Array. Das Ergebnis ist eine begrenzte Warteschlange, deren Größe vorbestimmt ist.

Die Operationen put und take in der ArrayBlockingQueue teilen sich dieselbe Sperre. Der Leistungseinbruch ist die Zusicherung wert, dass keine Einträge überschrieben werden.

Insbesondere ordnet die Warteschlange das Array im Voraus zu, bevor es verwendet wird. Während dies durchgehend zunehmen kann, könnte es auch zu viel Speicher beanspruchen.

Eine solche Verwendung ist eine einfache Aufgabenwarteschlange. Es ist üblich, in dieser Situation viel Personal zu haben, um eine kleine Anzahl von Kunden fertigzustellen.

Da die Größe dieser Warteschlange begrenzt ist, bietet sie eine Pufferzone im Falle von Speicherbeschränkungen. Ein Beispiel ist die Möglichkeit einer langen Periode, während der eine Warteschlange mit großer Kapazität leer bleibt.

Fairness-Richtlinie bedeutet, dass die Sperrimplementierung die Thread-Reihenfolge angemessen aufrechterhält. Wenn Thread A zuerst in die Lock-Akquisitionsphase eintritt und Thread B eintritt, erhält Thread A die Sperre.

Ohne Gerechtigkeit ist das Ergebnis unklar. Es wird wahrscheinlich nach dem folgenden Thread geplant.

Java LinkedBlockingQueue

Jedes Element in der LinkedBlockingQueue wird durch einen neuen Knoten in der LinkedList-Variation repräsentiert, die von der Warteschlange verwendet wird.

Die Leistung von LinkedBlockingQueue variiert erheblich von Lauf zu Lauf. Das heißt; Wir müssen unsere Umstände ständig profilieren, um sicherzustellen, dass wir die am besten geeignete Datenstruktur verwenden.

Beste Warteschlange zum Implementieren in Java

Jedes Mal, wenn ein Element hinzugefügt oder aus der Warteschlange entfernt wird, muss LinkedBlockingQueue eine Zuweisung und Freigabe von Knoten durchführen. Daher kann eine ArrayBlockingQueue vorzuziehen sein, wenn die Warteschlange schnell zu- und abnimmt.

Die Grösse einer ArrayBlockingQueue ist immer gleich. Das Hinzufügen des elften Elements mit einer Kapazität von 10 bewirkt, dass die Anweisung insert anhält, bis ein vorhandener Thread ein Element löscht.

Wenn viele Threads gleichzeitig versuchen, Elemente zur Warteschlange hinzuzufügen und zu löschen – wenn die Warteschlange nicht verfügbar ist – führt dies zu einem Fairnessproblem. Der erste Thread, der etwas anfordert, ist dank eines Fairness-Mechanismus immer der erste, der es bekommt.

Andernfalls kann die Wartezeit für einen Thread viel länger sein als die Wartezeit für einen anderen, was zu unerwartetem Verhalten führt. Aber die Last der Verwaltung von Fairness wird den Durchsatz verringern.

Die Wahl hängt jedoch davon ab, ob Sie die Sperrung benötigen oder nicht. Es klingt nach einer Situation, in der es viele Lieferanten, aber nur einen Käufer gibt.

Wenn viele Verbraucher, aber nur ein Erzeuger vorhanden sind, ist das Sperrverhalten möglicherweise nicht erforderlich. In diesen Fällen können die Verbraucher prüfen, ob die Warteschlange leer ist, und fortfahren, wenn dies der Fall ist.

Implementierung von ArrayBlockingQueue in Java

Die ArrayBlockingQueue-Implementierung verwendet die single-lock-Doppelbedingungstechnik. Sein Konstruktor hat zugrunde liegende Datenstrukturen, Array bzw. LinkedList.

Das Folgende ist der Konstruktor für die ArrayBlockingQueue:

public ArrayBlockingQueue(int capacity, boolean fair) {
  if (capacity < = 0)
    throw new IllegalArgumentException();
  this.items = new Object[capacity];
  lock = new ReentrantLock(fair);
  notEmpty = lock.newCondition();
  notFull = lock.newCondition();
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

Verwandter Artikel - Java Queue