{"id":28947,"date":"2022-04-20T17:03:02","date_gmt":"2022-04-20T15:03:02","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=28947"},"modified":"2024-11-27T15:09:06","modified_gmt":"2024-11-27T14:09:06","slug":"concurrentlinkedqueue-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/concurrentlinkedqueue-java\/","title":{"rendered":"ConcurrentLinkedQueue in Java (mit Beispiel)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In diesem Artikel erf\u00e4hrst du alles \u00fcber die <code>ConcurrentLinkedQueue<\/code>, deren Eigenschaften und Einsatzszenarien. Anhand eines Beispiels siehst du, wie man <code>ConcurrentLinkedQueue<\/code> einsetzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier befinden wir uns in der Klassenhierarchie:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"500\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-800x500.png\" alt=\"ConcurrentLinkedQueue in der Klassenhierarchie\" class=\"wp-image-28970\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy-1200x750.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ConcurrentLinkedQueue-class-hierarchy.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>ConcurrentLinkedQueue in der Klassenhierarchie<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"concurrentlinkedqueue-eigenschaften\">ConcurrentLinkedQueue Eigenschaften<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Klasse <code>java.util.concurrent.ConcurrentLinkedQueue<\/code> basiert auf einer einfach verketteten Liste und ist \u2013 wie die meisten Queue-Implementierungen \u2013 threadsicher (<a href=\"#concurrentlinkedqueue-performance\">s. u.<\/a>).<\/p>\n\n\n\n<p class=\"hc-footnote wp-block-paragraph\">(Die einzige nicht threadsichere Queue ist <code>PriorityQueue<\/code> \u2013 sowie die Deques <code>ArrayDeque<\/code> und <code>LinkedList<\/code>, welche auch das Queue-Interface implementieren. Dazu mehr in der n\u00e4chsten Tutorial-Serie \"Deques\".)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da die L\u00e4nge einer verketteten Liste nur aufw\u00e4ndig zu bestimmen ist, ist <code>ConcurrentLinkedQueue<\/code> unbounded. <code>ConcurrentLinkedQueue<\/code> bietet au\u00dferdem keine blockierenden Operationen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Eigenschaften im Detail:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes less-line-height\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Unterliegende Datenstruktur<\/th><th class=\"has-text-align-center\" data-align=\"center\">Thread-safe?<\/th><th class=\"has-text-align-center\" data-align=\"center\">Blocking\/<br>Non-blocking<\/th><th class=\"has-text-align-center\" data-align=\"center\">Bounded\/<br>Unbounded<\/th><th class=\"has-text-align-center\" data-align=\"center\">Iterator Type<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">Verkettete Liste<\/td><td class=\"has-text-align-center\" data-align=\"center\">Ja<br><span style=\"font-size:90%\">(optimistisches Locking durch Compare-and-set)<\/span><\/td><td class=\"has-text-align-center\" data-align=\"center\">Non-blocking<\/td><td class=\"has-text-align-center\" data-align=\"center\">Unbounded<\/td><td class=\"has-text-align-center\" data-align=\"center\">Weakly consistent\u00b9<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"hc-footnote wp-block-paragraph\">\u00b9 Weakly consistent: Alle Elemente, die zum Zeitpunkt der Erzeugung des Interators in der Queue liegen, werden vom Iterator genau einmal durchlaufen. \u00c4nderungen, die danach erfolgen, k\u00f6nnen \u2013 m\u00fcssen aber nicht \u2013 durch den Iterator ber\u00fccksichtigt werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"einsatzempfehlung\">Einsatzempfehlung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ConcurrentLinkedQueue<\/code> ist eine gute Wahl, wenn eine threadsichere, nicht blockierende und unbounded Queue ben\u00f6tigt wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dies gilt trotz meiner <a href=\"\/de\/algorithmen\/array-vs-linked-list\/\">allgemeinen Empfehlung Array-basierte Datenstrukturen solchen vorzuziehen<\/a>, die mit verketteten Listen implementiert sind. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Array-basierte Alternativen sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Das im Folgetutorial \u00fcber Deques beschriebene <code>ArrayDeque<\/code> \u2013 dieses ist allerdings nicht thread-safe.<\/li><li>Die sp\u00e4ter in diesem Tutorial beschriebe <a href=\"\/de\/algorithmen\/arrayblockingqueue-java\/\">ArrayBlockingQueue<\/a> \u2013 diese ist zum einen <em>bounded<\/em>, und zum anderen wird die Threadsicherheit \u00fcber ein einzelnes <code>ReentrantLock<\/code> implementiert. Dies ist f\u00fcr die meisten Einsatzszenarien (mit niedriger bis mittlerer Contention) unperformanter ist als optimistisches Locking.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"concurrentlinkedqueue-beispiel\">ConcurrentLinkedQueue Beispiel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgende Beispiel demonstriert die Threadsicherheit von <code>ConcurrentLinkedDeque<\/code>. Vier schreibende und drei lesende Threads f\u00fcgen nebenl\u00e4ufig Elemente in die Queue ein und entnehmen sie wieder (\u2192 <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/ConcurrentLinkedQueueExample.java\" target=\"_blank\">Code auf GitHub<\/a>):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcurrentLinkedQueueExample<\/span> <\/span>{\n\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">int<\/span> NUMBER_OF_PRODUCERS = <span class=\"hljs-number\">4<\/span>;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">int<\/span> NUMBER_OF_CONSUMERS = <span class=\"hljs-number\">3<\/span>;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">int<\/span> NUMBER_OF_ELEMENTS_TO_PUT_INTO_QUEUE_PER_THREAD = <span class=\"hljs-number\">5<\/span>;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">int<\/span> MIN_SLEEP_TIME_MILLIS = <span class=\"hljs-number\">500<\/span>;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">int<\/span> MAX_SLEEP_TIME_MILLIS = <span class=\"hljs-number\">2000<\/span>;\n\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">int<\/span> POISON_PILL = -<span class=\"hljs-number\">1<\/span>;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n    Queue&lt;Integer&gt; queue = <span class=\"hljs-keyword\">new<\/span> ConcurrentLinkedQueue&lt;&gt;();\n\n    <span class=\"hljs-comment\">\/\/ Start producers<\/span>\n    CountDownLatch producerFinishLatch = <span class=\"hljs-keyword\">new<\/span> CountDownLatch(NUMBER_OF_PRODUCERS);\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; NUMBER_OF_PRODUCERS; i++) {\n      createProducerThread(queue, producerFinishLatch).start();\n    }\n\n    <span class=\"hljs-comment\">\/\/ Start consumers<\/span>\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; NUMBER_OF_CONSUMERS; i++) {\n      createConsumerThread(queue).start();\n    }\n\n    <span class=\"hljs-comment\">\/\/ Wait until all producers are finished<\/span>\n    producerFinishLatch.await();\n\n    <span class=\"hljs-comment\">\/\/ Put poison pills on the queue (one for each consumer)<\/span>\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; NUMBER_OF_CONSUMERS; i++) {\n      queue.offer(POISON_PILL);\n    }\n\n    <span class=\"hljs-comment\">\/\/ We'll let the program end when all consumers are finished<\/span>\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> Thread <span class=\"hljs-title\">createProducerThread<\/span><span class=\"hljs-params\">(\n      Queue&lt;Integer&gt; queue, CountDownLatch finishLatch)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Thread(\n        () -&gt; {\n          ThreadLocalRandom random = ThreadLocalRandom.current();\n          <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; NUMBER_OF_ELEMENTS_TO_PUT_INTO_QUEUE_PER_THREAD; i++) {\n            sleepRandomTime();\n\n            Integer element = random.nextInt(<span class=\"hljs-number\">1000<\/span>);\n            queue.offer(element);\n            System.out.printf(\n                <span class=\"hljs-string\">\"&#091;%s] queue.offer(%3d)        --&gt; queue = %s%n\"<\/span>,\n                Thread.currentThread().getName(), element, queue);\n          }\n\n          finishLatch.countDown();\n        });\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> Thread <span class=\"hljs-title\">createConsumerThread<\/span><span class=\"hljs-params\">(Queue&lt;Integer&gt; queue)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Thread(\n        () -&gt; {\n          <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-keyword\">true<\/span>) {\n            sleepRandomTime();\n\n            Integer element = queue.poll();\n            System.out.printf(\n                <span class=\"hljs-string\">\"&#091;%s]     queue.poll() = %4d --&gt; queue = %s%n\"<\/span>,\n                Thread.currentThread().getName(), element, queue);\n\n            <span class=\"hljs-comment\">\/\/ End the thread when a poison pill is detected<\/span>\n            <span class=\"hljs-keyword\">if<\/span> (element != <span class=\"hljs-keyword\">null<\/span> &amp;&amp; element == POISON_PILL) {\n              <span class=\"hljs-keyword\">break<\/span>;\n            }\n          }\n        });\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">sleepRandomTime<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    ThreadLocalRandom random = ThreadLocalRandom.current();\n    <span class=\"hljs-keyword\">try<\/span> {\n      Thread.sleep(random.nextInt(MIN_SLEEP_TIME_MILLIS, MAX_SLEEP_TIME_MILLIS));\n    } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n      Thread.currentThread().interrupt();\n    }\n  }\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Hier die ersten 10 Zeilen einer beispielhaften Ausgabe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">&#091;Thread-1] queue.offer(982)        --&gt; queue = &#091;982]\n&#091;Thread-6]     queue.poll() =  982 --&gt; queue = &#091;]\n&#091;Thread-5]     queue.poll() = null --&gt; queue = &#091;]\n&#091;Thread-0] queue.offer(917)        --&gt; queue = &#091;917]\n&#091;Thread-3] queue.offer(224)        --&gt; queue = &#091;917, 224]\n&#091;Thread-2] queue.offer(932)        --&gt; queue = &#091;917, 224, 932]\n&#091;Thread-6]     queue.poll() =  917 --&gt; queue = &#091;224, 932]\n&#091;Thread-4]     queue.poll() =  224 --&gt; queue = &#091;932]\n&#091;Thread-5]     queue.poll() =  932 --&gt; queue = &#091;]\n&#091;Thread-0] queue.offer(607)        --&gt; queue = &#091;607]\n&#091;Thread-1] queue.offer( 87)        --&gt; queue = &#091;607, 87]\n&#091;Thread-3] queue.offer(264)        --&gt; queue = &#091;607, 87, 264]\n&#091;Thread-4]     queue.poll() =  607 --&gt; queue = &#091;87, 264]\n&#091;Thread-0] queue.offer(348)        --&gt; queue = &#091;87, 264, 348]\n&#091;Thread-2] queue.offer(728)        --&gt; queue = &#091;87, 264, 348, 728]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wir sehen sehr sch\u00f6n, wie die sieben Threads Elemente einf\u00fcgen und entnehmen. In der dritten Zeile sehen wir auch, dass Thread 5 beim Aufruf von <code>queue.poll()<\/code> den Wert <code>null<\/code> geliefert bekommen hat, da die Queue zu diesem Zeitpunkt leer war.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"concurrentlinkedqueue-performance\">ConcurrentLinkedQueue Performance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Abschnitt behandelt die Threadsicherheit und Zeitkomplexit\u00e4t von <code>ConcurrentLinkedQueue<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ist-concurrentlinkedqueue-threadsicher\">Ist ConcurrentLinkedQueue threadsicher?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Threadsicherheit der <code>ConcurrentLinkedQueue<\/code> wird durch optimistisches Locking erzielt. Genauer gesagt: durch nicht-blockierende Compare-and-set (CAS)-Operationen auf separate VarHandles f\u00fcr den Kopf und das Ende der Queue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beim Zugriff auf Queues ist normalerweise niedrige bis moderate Contention (Zugriffskonflikte durch mehrere Threads) zu erwarten, da ein Thread in der Regel nicht ununterbrochen auf die Queue zugreift, sondern das einzustellende Element erstmal erzeugen bzw. das entnommende Element verarbeiten muss.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei niedriger bis moderater Contention erzielt optimistisches Locking einen deutlichen Performance-Gewinn gegen\u00fcber pessimistischem Locking durch implizite oder explizite Locks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unterschiede zu anderen Queues:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Bei <a href=\"\/de\/algorithmen\/linkedblockingqueue-java\/\">LinkedBlockingQueue<\/a> wird die Threadsicherheit durch pessimistisches Locking via zweier <code>ReentrantLock<\/code>s gew\u00e4hrleistet, was zu besserer Performance bei hoher Contention f\u00fchren kann.<\/li><li>Bei <a href=\"\/de\/algorithmen\/arrayblockingqueue-java\/\">ArrayBlockingQueue<\/a> wird die Threadsicherheit durch ein einzelnes <code>ReentrantLock<\/code> gew\u00e4hrleistet.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"concurrentlinkedqueue-zeitkomplexitaet\">ConcurrentLinkedQueue Zeitkomplexit\u00e4t<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wie bei allen Queues ist der Aufwand f\u00fcr die Enqueue- und Dequeue-Operationen unabh\u00e4ngig von der L\u00e4nge der Queue. Die Zeitkomplexit\u00e4t betr\u00e4gt also <em>O(1)<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dies gilt hingegen nicht f\u00fcr die <code>size()<\/code>-Methode. Um die L\u00e4nge der Queue zu bestimmen, muss \u00fcber alle Elemente der verketteten Liste iteriert werden. Je l\u00e4nger die Queue, desto l\u00e4nger dauert es die L\u00e4nge zu berechnen. Die Zeitkomplexit\u00e4t f\u00fcr <code>size()<\/code> betr\u00e4gt somit <em>O(n)<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(Hier findest du eine <a href=\"\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">Einf\u00fchrung in das Thema Zeitkomplexit\u00e4t<\/a>.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfassung-und-ausblick\">Zusammenfassung und Ausblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Teil der Tutorialserie habe ich dir die konkrete Queue-Implementierung <code>ConcurrentLinkedQueue<\/code> und deren Eigenschaften vorgestellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im folgenden Teil wird es um die <a href=\"\/de\/algorithmen\/priorityqueue-java\/\">PriorityQueue<\/a> gehen, die einige \u00dcberraschungen bereith\u00e4lt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn du noch Fragen hast, stelle sie gerne \u00fcber die Kommentar-Funktion. M\u00f6chtest du \u00fcber neue Tutorials und Artikel informiert werden? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders.eu-Newsletter anzumelden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie benutzt man die Java ConcurrentLinkedQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?<\/p>\n","protected":false},"author":1,"featured_media":29406,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie benutzt man die Java ConcurrentLinkedQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"none","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"both","_seopress_redirections_param":"","_seopress_redirections_type":301,"_seopress_analysis_target_kw":"concurrentlinkedqueue","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[{"_seopress_pro_rich_snippets_type":"none"}],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":8116,"_post_count":0,"footnotes":""},"categories":[127],"tags":[192],"class_list":["post-28947","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-datenstrukturen-queue"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/chains-947713-1770x986-1.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Wie benutzt man die Java ConcurrentLinkedQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","public_identification_id":"4935e67c87d34526ab0e2ad526ff13a1","private_identification_id":"f452b62ceb79401fbfb87348762407b4","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/28947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=28947"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/28947\/revisions"}],"predecessor-version":[{"id":41706,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/28947\/revisions\/41706"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/29406"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=28947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=28947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=28947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}