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?
Antwort
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.
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?
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
- 1. Java: ArrayBlockingQueue vs. LinkedBlockingQueue
- 2. Ist SQL Server 2005 Express gut genug für die Entwicklung?
- 3. Eine gut genug Linux IDE für Groovy/Grails-Code-Vervollständigung?
- 4. Wie gut wird Objective-J dokumentiert? Ist die Dokumentation gut genug, um sie ernsthaft zu verwenden?
- 5. Welche ist besser LinkedBlockingQueue unbounded oder LinkedBlockingQueue mit Kapazität
- 6. LinkedBlockingQueue - Producer/Consumer
- 7. Warum LinkedBlockingQueue # Poll() möglicherweise auflegen?
- 8. Wie gut ist die Dotfuscator Community Edition? Was ist "gut genug obfuscator"?
- 9. Benutzerdefinierte Implementierung von InputStream mit LinkedBlockingQueue hängen
- 10. Ist SQL Server Express gut genug für einen Entwickler oder sollte es eine Developer Edition geben?
- 11. Ist leer() genug oder verwenden Sie isset()?
- 12. Ist System.Threading.Timer effizient genug für Tausende von gleichzeitigen Timern?
- 13. OpenJDKs LinkedBlockingQueue-Implementierung: Node-Klasse und GC
- 14. ist WSAASyncSelect gut genug? Könnten Sie eine Alternative vorschlagen? Ist Indy besser?
- 15. Sind die Methoden zum Einfügen und Entfernen von LinkedBlockingQueue sicher?
- 16. Java: Berücksichtigt LinkedBlockingQueue die Reihenfolge der Verbraucher?
- 17. Verwenden Sie Systemnamespaces für Klassenbibliotheken: gut oder schlecht
- 18. Ist es gut, elasticsearch für Container zu verwenden?
- 19. Überprüfung Zeichenfolge für ein stark genug Passwort
- 20. Verwenden von Datentabellen für breite (weit genug aus dem Bildschirm zu gehen) Tabellen
- 21. Wann ist es gut, FTP zu verwenden?
- 22. Zersetzung in Java, wann ist genug genug?
- 23. Android: Ist EXTERNAL_CONTENT_URI genug für eine Fotogalerie?
- 24. Ist es gut, nur GCM für die Entwicklung von Chat-Anwendungen für Android XMPP zu verwenden?
- 25. Ist bigint groß genug für eine Ereignisprotokolltabelle?
- 26. Wie lange sollte mein Passwort Salz sein, und ist SHA-256 gut genug?
- 27. Ist die Link-Zeit-Optimierung in gcc 5.1 gut genug, um auf einfache Funktionen zu verzichten?
- 28. Python TypeError: nicht genug Argumente für Formatzeichenfolge
- 29. Silverlight: ListBox groß genug für alle Inhalte?
- 30. Ist SpeC# stabil genug für die Verwendung?
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() ''? –
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
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? –