2012-09-26 10 views
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 nicht ganz sicher, wie man testet, wenn es threadsicher ist, da ich nicht beide Threads take() gleichzeitig aufrufen kann, weil die Reihenfolge der Ausführung untermineristisch ist. Irgendwelche Ideen? Vielen Dank.Verwenden von LinkedBlockingQueue gut genug für Multi-Thread-Java-Programm?

+0

Während die Reihenfolge der Ausführung nicht deterministisch ist, wäre nicht der Beweis dafür, dass LBQ nicht gut genug, wenn einige Elemente sein wird Sie '' put() '' nicht angezeigt werden, oder das selbe Item Item erscheint wiederholt in den Ergebnissen von '' take() ''? –

+0

Ich denke, das ist ein möglicher Test, aber es ist vielleicht nicht immer ein Thread-spezifischer Test. Vielleicht Thread Sleep in der Mitte des Aufrufs take() verwenden, während andere Thread es auch anruft? – Dan

+0

Das, was Executors standardmäßig verwendet, führt mich zu der Frage; Können Sie keinen ExecutorService verwenden, der eine Warteschlange und einen Thread Pool umschließt? –

Antwort

7

Es ist absolut thread-sicher für das, was Sie tun, in der Tat ist das, wofür es entwickelt wurde. Die Beschreibung der BlockingQueue (die die Schnittstelle von LinkedBlockingQueue implementiert ist) heißt es:

Blocking Implementationen sind threadsicher. Alle Warteschlangenmethoden erreichen ihre Effekte atomisch mit internen Sperren oder anderen Formen der Gleichzeitigkeitskontrolle.

1

Gleichzeitige put() und nehmen() sind nichtthread-safe, da sie zwei verschiedene Schlösser verwenden.

Dies ist bereits hier beantwortet: Are LinkedBlockingQueue's insert and remove methods thread safe?

+0

Ich folgte dem Link und fand eine Antwort auf einen anderen Beitrag, der erklärte, warum er Thread-sicher ist. http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 – user1266174

Verwandte Themen