{"id":30434,"date":"2022-06-07T22:06:41","date_gmt":"2022-06-07T20:06:41","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=30434"},"modified":"2024-11-27T15:09:01","modified_gmt":"2024-11-27T14:09:01","slug":"concurrentlinkeddeque-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/concurrentlinkeddeque-java\/","title":{"rendered":"ConcurrentLinkedDeque in Java (mit Beispiel)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In diesem Artikel erf\u00e4hrst du alles \u00fcber die Klasse <code>java.util.concurrent.ConcurrentLinkedDeque<\/code>:<\/p>\n\n\n\n<ul class=\"hc-checked-list wp-block-list\"><li>Was sind die Eigenschaften des <code>ConcurrentLinkedDeque<\/code>?<\/li><li>Wann sollte man es einsetzen?<\/li><li>Wie setzt man es ein (Java-Beispiel)?<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Hier befinden wir uns in der Klassenhierarchie:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"500\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-800x500.png\" alt=\"ConcurrentLinkedDeque in der Klassenhierarchie\" class=\"wp-image-30754\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy-1200x750.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-ConcurrentLinkedDeque-class-hierarchy.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>ConcurrentLinkedDeque in der Klassenhierarchie<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"concurrentlinkeddeque-eigenschaften\">ConcurrentLinkedDeque Eigenschaften<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ConcurrentLinkedDeque<\/code> ist das Deque-Pendant zur <a href=\"\/de\/algorithmen\/concurrentlinkedqueue-java\/\">ConcurrentLinkedQueue<\/a> und teilt deren Eigenschaften: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Es basiert auf einer doppelt verketteten Liste.<\/li><li>Threadsicherheit wird garantiert durch optimistisches Locking in Form von nicht-blockierenden Compare-and-set (CAS)-Operationen auf separate VarHandles f\u00fcr Kopf und Ende des Deques, sowie f\u00fcr die Referenzen der Listenknoten.<\/li><li>Um die L\u00e4nge eines <code>ConcurrentLinkedDeque<\/code> zu bestimmen, m\u00fcssen die Elemente der verketteten Liste gez\u00e4hlt werden. Der Aufwand hierf\u00fcr w\u00e4chst proportional mit der L\u00e4nge der Liste. Die Zeitkomplexit\u00e4t daf\u00fcr betr\u00e4gt also: <em>O(n)<\/em><\/li><li>Aufgrund der hohen Kosten f\u00fcr die L\u00e4ngenbestimmung ist <code>ConcurrentLinkedDeque<\/code> unbounded.<\/li><\/ul>\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\">Doppelt 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 im Deque 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>ConcurrentLinkedDeque<\/code> ist eine gute Wahl, wenn ein threadsicheres, nicht blockierendes, unbounded Deque ben\u00f6tigt wird. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr diesen Einsatzzweck existiert keine Array-basierte Alternative. Das einzige Array-basierte Deque, <a href=\"\/de\/algorithmen\/arraydeque-java\/\">ArrayDeque<\/a>, ist nicht threadsicher.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"concurrentlinkeddeque-beispiel\">ConcurrentLinkedDeque Beispiel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgende Beispiel (Klasse <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/deque\/ConcurrentLinkedDequeExample.java\" target=\"_blank\">ConcurrentLinkedDequeExample<\/a> auf GitHub) demonstriert die Threadsicherheit von <code>ConcurrentLinkedDeque<\/code>. Vier schreibende und drei lesende Threads f\u00fcgen nebenl\u00e4ufig Elemente an zuf\u00e4lligen Seiten des Deques ein bzw. entnehmen sie.<\/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\">ConcurrentLinkedDequeExample<\/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_DEQUE_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> Deque&lt;Integer&gt; deque;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> CountDownLatch producerFinishLatch =\n      <span class=\"hljs-keyword\">new<\/span> CountDownLatch(NUMBER_OF_PRODUCERS);\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">volatile<\/span> <span class=\"hljs-keyword\">boolean<\/span> consumerShouldBeStoppedWhenDequeIsEmpty;\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    <span class=\"hljs-keyword\">new<\/span> ConcurrentLinkedDequeExample().runDemo();\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\">void<\/span> <span class=\"hljs-title\">runDemo<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n    createDeque();\n    startProducers();\n    startConsumers();\n    waitUntilAllProducersAreFinished();\n\n    consumerShouldBeStoppedWhenDequeIsEmpty = <span class=\"hljs-keyword\">true<\/span>;\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">createDeque<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    deque = <span class=\"hljs-keyword\">new<\/span> ConcurrentLinkedDeque&lt;&gt;();\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">startProducers<\/span><span class=\"hljs-params\">()<\/span> <\/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_PRODUCERS; i++) {\n      createProducerThread().start();\n    }\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> Thread <span class=\"hljs-title\">createProducerThread<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Thread(\n        () -&gt; {\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_DEQUE_PER_THREAD; i++) {\n            sleepRandomTime();\n            insertRandomElementAtRandomSide();\n          }\n\n          producerFinishLatch.countDown();\n        });\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/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  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">insertRandomElementAtRandomSide<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    ThreadLocalRandom random = ThreadLocalRandom.current();\n    Integer element = random.nextInt(<span class=\"hljs-number\">1000<\/span>);\n    <span class=\"hljs-keyword\">if<\/span> (random.nextBoolean()) {\n      deque.offerFirst(element);\n      System.out.printf(\n          <span class=\"hljs-string\">\"&#091;%s] deque.offerFirst(%3d)        --&gt; deque = %s%n\"<\/span>,\n          Thread.currentThread().getName(), element, deque);\n    } <span class=\"hljs-keyword\">else<\/span> {\n      deque.offerLast(element);\n      System.out.printf(\n          <span class=\"hljs-string\">\"&#091;%s] deque.offerLast(%3d)         --&gt; deque = %s%n\"<\/span>,\n          Thread.currentThread().getName(), element, deque);\n    }\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">startConsumers<\/span><span class=\"hljs-params\">()<\/span> <\/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().start();\n    }\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> Thread <span class=\"hljs-title\">createConsumerThread<\/span><span class=\"hljs-params\">()<\/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> (shouldConsumerContinue()) {\n            sleepRandomTime();\n            removeElementFromRandomSide();\n          }\n        });\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">boolean<\/span> <span class=\"hljs-title\">shouldConsumerContinue<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> !(consumerShouldBeStoppedWhenDequeIsEmpty &amp;&amp; deque.isEmpty());\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">removeElementFromRandomSide<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (ThreadLocalRandom.current().nextBoolean()) {\n      Integer element = deque.pollFirst();\n      System.out.printf(\n          <span class=\"hljs-string\">\"&#091;%s]     deque.pollFirst() = %4d --&gt; deque = %s%n\"<\/span>,\n          Thread.currentThread().getName(), element, deque);\n    } <span class=\"hljs-keyword\">else<\/span> {\n      Integer element = deque.pollLast();\n      System.out.printf(\n          <span class=\"hljs-string\">\"&#091;%s]     deque.pollLast()  = %4d --&gt; deque = %s%n\"<\/span>,\n          Thread.currentThread().getName(), element, deque);\n    }\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">waitUntilAllProducersAreFinished<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n    producerFinishLatch.await();\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\">Im folgenden habe ich die ersten 15 Zeilen eines beispielhaften Programmlaufs abgedruckt:<\/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] deque.offerFirst(295)        --&gt; deque = &#091;295]\n&#091;Thread-4]     deque.pollLast()  =  295 --&gt; deque = &#091;]\n&#091;Thread-5]     deque.pollLast()  = null --&gt; deque = &#091;]\n&#091;Thread-2] deque.offerLast(982)         --&gt; deque = &#091;982]\n&#091;Thread-3] deque.offerFirst(190)        --&gt; deque = &#091;190, 982]\n&#091;Thread-0] deque.offerFirst(522)        --&gt; deque = &#091;522, 190, 982]\n&#091;Thread-6]     deque.pollLast()  =  982 --&gt; deque = &#091;522, 190]\n&#091;Thread-1] deque.offerLast(543)         --&gt; deque = &#091;522, 190, 543]\n&#091;Thread-0] deque.offerFirst(506)        --&gt; deque = &#091;506, 522, 190, 543]\n&#091;Thread-5]     deque.pollLast()  =  543 --&gt; deque = &#091;506, 522, 190]\n&#091;Thread-4]     deque.pollFirst() =  506 --&gt; deque = &#091;522, 190]\n&#091;Thread-3] deque.offerLast(760)         --&gt; deque = &#091;522, 190, 760]\n&#091;Thread-2] deque.offerFirst( 46)        --&gt; deque = &#091;46, 522, 190, 760]\n&#091;Thread-6]     deque.pollLast()  =  760 --&gt; deque = &#091;46, 522, 190]\n&#091;Thread-1] deque.offerLast(312)         --&gt; deque = &#091;46, 522, 190, 312]\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\">Es ist sch\u00f6n zu sehen, wie die sieben Threads Elemente an beiden Seiten des Deques einf\u00fcgen und entnehmen. In der dritten Zeile siehst du, wie Thread 5 beim Aufruf von <code>pollLast()<\/code> den R\u00fcckgabewert <code>null<\/code> geliefert bekommen hat, da zu diesem Zeitpunkt das Deque leer war.<\/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 hast du das auf einer verketteten Liste basierte, threadsichere <code>ConcurrentLinkedDeque<\/code> und seine Eigenschaften kennengelernt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im n\u00e4chsten Teil stelle ich dir das einzige <em>blockierende<\/em> Deque, <a href=\"\/de\/algorithmen\/linkedblockingdeque-java\/\">LinkedBlockingDeque<\/a>, vor.<\/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":30749,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie benutzt man das Java ConcurrentLinkedDeque? Wie funktioniert es? Was sind seine Eigenschaften? Wann sollte man es 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":"concurrentlinkeddeque","_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":7106,"_post_count":0,"footnotes":""},"categories":[127],"tags":[195],"class_list":["post-30434","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-datenstrukturen-deque"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/ConcurrentLinkedDeque-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":"1c18e0f15851425f969e2e6143a56c59","private_identification_id":"0d234d36248d49baba5103b27cfd31d6","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30434","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=30434"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30434\/revisions"}],"predecessor-version":[{"id":41705,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30434\/revisions\/41705"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/30749"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=30434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=30434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=30434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}