Verwenden von LinkedBlockingQueue gut genug für Multi-Thread-Java-Programm?

8

Ich habe einen Consumer und einen Producer, der Item-Objekte aus der Warteschlange hinzufügt und löscht. Wenn ich die Methoden put() und take() verwende. Gibt es irgendwelche Threadsicherheitsprobleme, die ich noch abdecken muss? Dies ist ähnlich dem Problem mit dem beschränkten Puffer, und ich habe mich nur gefragt, ob die Verwendung der blockierenden Warteschlange stattdessen die Notwendigkeit von Semaphoren oder Monitoren ersetzt. Das Item-Objekt selbst müsste wahrscheinlich synchronisiert werden (Setter aber Getter brauchen keine Lock), habe ich recht? Und schließlich bin ich mir nicht ganz sicher, wie ich testen soll, ob es Thread-sicher ist, da ich nicht gleichzeitig beide Threads take() aufrufen kann, weil die Ausführungsreihenfolge untermineristisch ist. Irgendwelche Ideen? Danke.

    
Dan 26.09.2012, 06:38
quelle

2 Antworten

7

Es ist absolut Thread-sicher für das, was Sie tun, in der Tat ist das, wofür es entwickelt wurde. Die Beschreibung von BlockingQueue (welche Schnittstelle implementiert ist von LinkedBlockingQueue ) besagt:

  

BlockingQueue-Implementierungen sind Thread-sicher. Alle Warteschlangenmethoden   erzielen ihre Effekte atomar mit internen Sperren oder anderen Formen   der Gleichzeitigkeitskontrolle.

    
Tudor 26.09.2012, 06:59
quelle
1

Simultan put () und take () sind nicht threadsicher , da sie zwei verschiedene Sperren verwenden.

Dies ist bereits beantwortet hier: Sind LinkedBlockingQueue Methoden Thread einzufügen und zu entfernen sicher?

    
Amrish Pandey 08.09.2014 04:03
quelle

Tags und Links