Diese Frage verdient eine bessere Antwort.
Java ConcurrentLinkedQueue
basiert auf dem berühmten Algorithmus von Maged M. Michael und Michael L. Scott für nicht blockierende Warteschlangen ohne Sperren .
"Nicht blockierend" als Begriff für eine konkurrierende Ressource (unsere Warteschlange) bedeutet, dass unabhängig davon, was der Scheduler der Plattform tut, wie das Unterbrechen eines Threads oder wenn der betreffende Thread einfach zu langsam ist, andere Threads um dieselbe Ressource konkurrieren wird noch in der Lage sein, Fortschritte zu machen. Wenn es sich beispielsweise um eine Sperre handelt, kann der Thread, der die Sperre hält, unterbrochen werden, und alle Threads, die auf diese Sperre warten, werden blockiert. Intrinsische Sperren (das synchronized
Schlüsselwort) in Java können auch mit erheblichen Leistungseinbußen verbunden sein - wie beim voreingenommenen Sperrenist beteiligt und Sie haben Konflikte, oder nachdem die VM beschlossen hat, die Sperre nach einer Spin-Grace-Periode zu "aufblasen" und konkurrierende Threads zu blockieren ... weshalb in vielen Kontexten (Szenarien mit geringen / mittleren Konflikten) Vergleiche und -Sätze für atomare Referenzen können viel effizienter sein, und genau das tun viele nicht blockierende Datenstrukturen.
Java ConcurrentLinkedQueue
ist nicht nur nicht blockierend, sondern hat auch die großartige Eigenschaft, dass der Produzent nicht mit dem Verbraucher konkurriert. In einem Einzelproduzenten / Einzelkonsumentenszenario (SPSC) bedeutet dies wirklich, dass es keinen nennenswerten Streit geben wird. In einem Szenario mit mehreren Herstellern / einzelnen Verbrauchern wird der Verbraucher nicht mit den Herstellern konkurrieren. Diese Warteschlange hat Konflikte, wenn mehrere Produzenten dies versuchen offer()
, aber das ist per Definition Parallelität. Es ist im Grunde eine allgemeine und effiziente nicht blockierende Warteschlange.
Das BlockingQueue
Blockieren eines Threads, um in einer Warteschlange zu warten, ist eine schrecklich schreckliche Art, gleichzeitige Systeme zu entwerfen. Tu es nicht. Wenn Sie nicht herausfinden können, wie ein ConcurrentLinkedQueue
in einem Consumer / Producer-Szenario verwendet wird, wechseln Sie einfach zu übergeordneten Abstraktionen, wie z. B. einem guten Schauspieler-Framework.