wake-up-neo.com

Sind LinkedBlockingQueues Methoden zum Einfügen und Entfernen von Threads sicher?

Ich verwende LinkedBlockingQueue zwischen zwei verschiedenen Threads. Ein Thread fügt Daten über add hinzu, während der andere Thread Daten über take empfängt.

Meine Frage ist, muss ich den Zugriff auf add und take synchronisieren. Ist die Einfüge- und Entfernungsmethode von LinkedBlockingQueue threadsicher?

51
Steve Kuo

Ja. Von den Dokumenten

"BlockingQueue-Implementierungen sind Threadsicher. Alle Warteschlangenmethoden Erzielen ihre Auswirkungen atomar mit Internen Sperren oder anderen Formen der Parallelitätssteuerung. Die Massen- Collection-Vorgänge addAll. . EnthältAll, RetainAll und RemoveAll werden nicht notwendigerweise atomar ausgeführt, sofern nicht anders in einer Implementierung angegeben. So ist es möglich, dass addAll (c) .__ eine Ausnahme) nach Hinzufügen nur einiger Elemente in c. "

54

Ja, BlockingQueue-Methoden add() und take() sind threadsicher, jedoch mit einem Unterschied

Die add ()- und take()-Methode verwendet zwei verschiedene ReentrantLock-Objekte.

add() Methode verwendet 

private final ReentrantLock putLock = new ReentrantLock();

take() Methode verwendet 

private final ReentrantLock takeLock = new ReentrantLock();

Daher ist der gleichzeitige Zugriff auf die add()-Methode synchronisiert. Ebenso ist der gleichzeitige Zugriff auf die take()-Methode synchronized.

Der gleichzeitige Zugriff auf die add()- und die take()-Methode ist jedoch nicht synchronized, da sie zwei verschiedene Sperrobjekte verwenden (außer bei Randbedingung der Warteschlange voll/leer).

11
Amrish Pandey

Ja, es ist definitiv Thread-sicher, sonst hätte es sich nicht als Kandidat für das Speichern von Elementen für ThreadPoolExecutor qualifiziert.

Fügen Sie einfach ein Element hinzu und rufen Sie es ab, ohne sich um Parallelität für BlockingQueue zu kümmern.

0
Java Guru