{"id":2641,"date":"2014-01-12T07:46:46","date_gmt":"2014-01-12T05:46:46","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2641"},"modified":"2014-01-12T07:46:46","modified_gmt":"2014-01-12T05:46:46","slug":"java-util-concurrent-atomic-longadder-und-doubleadder-in-java-8","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2014\/01\/java-util-concurrent-atomic-longadder-und-doubleadder-in-java-8\/","title":{"rendered":"java.util.concurrent.atomic.LongAdder und DoubleAdder in Java 8"},"content":{"rendered":"<p>Die AtomicXXX-Klassen sind gut, wenn es nicht zu viele parallel Threads gibt, die gleichzeitig die AtomicXXX-Exemplare ver\u00e4ndern. Der Grund ist einfach: jeder Thread warten muss, bis ein anderer Thread die Ver\u00e4nderung am AtomicXXX vorgenommen hat. Stehen also 100 Threads in der Schlage den AtomicXXX zu ver\u00e4ndern, werden sie erst nacheinander abgearbeitet \u2013 das geht zwar an schnell, dennoch f\u00fchrt die sequenzielle Verarbeitung zu Wartesituationen. <\/p>\n<p>Wenn es wirkliche viel nebenl\u00e4ufige Threads gibt, sind die AtomicXXX-Klassen nicht optimal und Java biete ab Java 8 zwei neue Klassen LongAdder und DoubleAdder. Ein XXXAdder sieht nach au\u00dfen wie ein long\/double aus (die Klassen erweitern auch Number), doch intern sind sie vielmehr eine Liste von Werten, auf die dann unterschiedliche Thread zugreifen k\u00f6nnen, ohne zu warten. Um sich das vorzustellen zu k\u00f6nnen ein Beispiel: Nehmen wir an, mehrere Threads teilen sich einen LongAdder. Ruft ein Thread add(1) auf, so f\u00fchrt das intern zu einem Element in einer Liste<a href=\"#_ftn1_5451\" name=\"_ftnref1_5451\">[1]<\/a>. Kommt gleichzeitig add(2) am LongAdder an, muss der Thread nicht auf das Ende vom ersten add(\u2026) warten, sondern f\u00fcgt einen neuen Knoten an. Kommt sp\u00e4ter ein dritter und vierter Thread \u00fcber den Weg und f\u00fchrt add(3) und add(4) aus, k\u00f6nnen diese ohne Warten an den ersten und zweiten existieren Knoten gehen und die Werte addieren, in den beiden internen Knoten stehen also 4 und 6. Es sind also nur so viele Knoten intern n\u00f6tig, wie wirklich parallele Threads auftauchen. Eine Summation am Ende mit sum() l\u00e4uft dann \u00fcber die internen Knoten und summiert sie auf zu 10, was 1+2+3+4 ist. <\/p>\n<hr align=\"left\" size=\"1\" width=\"33%\"\/>\n<p><a href=\"#_ftnref1_5451\" name=\"_ftn1_5451\">[1]<\/a> Genau genommen beim ersten Element noch in einer Variablen, die Liste beginnt erst beim zweiten Element, also beim zweiten parallelen Thread.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die AtomicXXX-Klassen sind gut, wenn es nicht zu viele parallel Threads gibt, die gleichzeitig die AtomicXXX-Exemplare ver\u00e4ndern. Der Grund ist einfach: jeder Thread warten muss, bis ein anderer Thread die Ver\u00e4nderung am AtomicXXX vorgenommen hat. Stehen also 100 Threads in der Schlage den AtomicXXX zu ver\u00e4ndern, werden sie erst nacheinander abgearbeitet \u2013 das geht zwar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,66],"tags":[],"class_list":["post-2641","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-8"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2641"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2641\/revisions"}],"predecessor-version":[{"id":2642,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2641\/revisions\/2642"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}