Künstliche Intelligenz
Core Java: Parallel, aber richtig – Wie Java-Collectors unter Last bestehen
Manchmal reicht es nicht aus, dass Code funktioniert – er muss auch unter Last funktionieren. In modernen Anwendungen, die große Datenmengen verarbeiten, steht Entwicklerinnen und Entwicklern mit der Streams-API in Java ein elegantes, deklaratives Werkzeug zur Verfügung, um Daten in Pipelines zu transformieren, zu filtern und schließlich zu aggregieren. Die Vorstellung, mit wenigen Zeilen komplexe Datenoperationen zu beschreiben, ist nicht nur verführerisch, sondern tatsächlich realistisch. Doch was passiert, wenn diese Operationen auf Millionen von Einträgen treffen? Wenn die Ausführung in mehreren Threads parallel erfolgen soll, um Zeit zu sparen und Mehrkernsysteme effektiv zu nutzen?
Seit 1996 programmiert Sven Java in Industrieprojekten und seit über 15 Jahren weltweit in Branchen wie Automobil, Raumfahrt, Versicherungen, Banken, UN und Weltbank. Seit über 10 Jahren ist er von Amerika bis nach Neuseeland als Speaker auf Konferenzen und Community Events, arbeitete als Developer Advocate für JFrog und Vaadin und schreibt regelmäßig Beiträge für IT-Zeitschriften und Technologieportale.
Neben seinem Hauptthema Core Java beschäftigt er sich mit TDD und Secure Coding Practices.
Genau an dieser Stelle rückt ein Konzept in den Vordergrund, das oft zu wenig Beachtung findet: der Collector. Er ist das Element am Ende einer Stream-Pipeline, das bestimmt, was mit den verarbeiteten Daten geschehen soll. Und obwohl die API einfach erscheint – collect(Collectors.toList())
– verbirgt sich dahinter eine Architektur, die in paralleler Ausführung ganz eigene Herausforderungen mit sich bringt.
Im Folgenden geht es daher nicht nur um die Syntax oder die Mechanik von Collectoren, sondern um ein tiefes Verständnis für die Bedingungen, unter denen sie korrekt und effizient zum Einsatz kommen. Wir schauen auf Standardlösungen des JDK (Java Development Kit), diskutieren individuelle Implementierungen, zeigen typische Fehler – und kommen letztlich zu der Frage: Wie viel Parallelisierung verträgt ein Collector, ohne dass es gefährlich wird?
Grundlagen: Collector und Parallelität
Die Streams-API von Java vermittelt auf den ersten Blick den Eindruck, dass sich das Sammeln von Ergebnissen – das sogenannte terminale Aggregieren – problemlos parallelisieren lässt. Doch hinter der Methode collect(...)
verbirgt sich mehr als nur syntaktische Bequemlichkeit. Sie ist eine koordinierte Zusammenarbeit zwischen einem Datenstrom und einem Collector – einem Objekt, das aus Einzelteilen ein Ganzes formt.
Ein Collector besteht im Kern aus vier funktionalen Komponenten: dem supplier
, der für jeden Teilprozess einen neuen Zwischenspeicher bereitstellt; dem accumulator
, der Elemente in diesen Zwischenspeicher einspeist; dem combiner
, der mehrere Zwischenspeicher zu einem zusammenführt; und schließlich dem finisher
, der das Endergebnis produziert. Während supplier
und accumulator
auch in sequenziellen Streams essenziell sind, tritt der combiner
erst dann in Aktion, wenn mehrere Threads unabhängig voneinander gesammelt haben – also bei einem parallelStream()
.
Hier liegt der erste fundamentale Unterschied zwischen sequenzieller und paralleler Verarbeitung: In einem sequenziellen Stream genügt es, schrittweise in einen einzigen Speicher zu akkumulieren. In der parallelen Variante hingegen entstehen mehrere voneinander isolierte Zwischenspeicher, deren Inhalte später konfliktfrei zu einem Endergebnis verschmolzen werden müssen. Dieses Verschmelzen geschieht durch den combiner
– und genau an dieser Stelle entscheidet sich, ob ein Collector für parallele Verarbeitung tauglich ist oder nicht.
Die Tauglichkeit hängt von mehreren Eigenschaften ab: Die Operationen müssen assoziativ sein, also unabhängig von der Kombination der Zwischenergebnisse dasselbe Resultat liefern. Zudem darf kein geteilter Zustand ohne Synchronisierung vorliegen. Und nicht zuletzt müssen die einzelnen Schritte deterministisch und frei von Seiteneffekten bleiben – andernfalls wird aus einer Parallelisierung schnell eine Quelle subtiler Fehler.
Das Wissen um diese strukturellen Anforderungen ist der erste Schritt zu einem bewussten Einsatz paralleler Verarbeitung. Denn nur wer verstanden hat, wie Collector und Stream im Zusammenspiel funktionieren, kann abschätzen, wann ein Performancegewinn möglich ist – und wann man sich stattdessen instabile oder schlicht falsche Ergebnisse einhandelt.
Kriterien für parallelisierbare Collectoren
Stellen wir uns vor, ein Stream wird parallel ausgeführt – etwa über ein großes Dataset, das in mehrere Segmente aufgeteilt ist. Jedes dieser Segmente wird nun unabhängig verarbeitet. Was trivial klingt, hat tiefgreifende Implikationen: Sobald mehrere Threads gleichzeitig sammeln, dürfen sich deren Zwischenergebnisse nicht in die Quere kommen. Die Verantwortung für die Korrektheit liegt beim Collector – genauer: bei seiner strukturellen und funktionalen Ausgestaltung.
Die erste grundlegende Eigenschaft ist Assoziativität. Ein combiner
-Aufruf muss unabhängig von der Reihenfolge konsistente Ergebnisse liefern. combine(a, b)
und combine(b, a)
müssen äquivalente Resultate erzeugen. Das ist notwendig, weil die Reihenfolge der Kombination in einem parallelen Kontext vom Scheduler abhängt – und somit unvorhersagbar ist.
Der zweite Punkt betrifft den Zugriff auf Speicherstrukturen. Sobald ein Collector während der Akkumulation einen gemeinsamen, veränderbaren Zustand nutzt – etwa eine nicht synchronisierte Liste oder Map – entsteht ein potenzieller Hotspot für Race Conditions. Der Collector muss entweder ausschließlich mit lokalen, thread-isolierten Zwischenspeichern arbeiten oder sich auf nebenläufige Datenstrukturen stützen, wie etwa ConcurrentHashMap
, LongAdder
oder explizit synchronisierte Wrapper.
Darüber hinaus ist auch Determinismus ein wesentliches Kriterium: Eine parallele Ausführung darf nicht zu unterschiedlichen Ergebnissen führen – weder inhaltlich noch strukturell. Insbesondere bei ungeordneten Strukturen wie HashSet
oder HashMap
ist Vorsicht geboten, da die Iterationsreihenfolge variieren kann – was bei Collectors.joining()
oder Collectors.toMap()
problematisch wird, wenn die Anwendung auf Ordnung angewiesen ist.
Die drei Anforderungen Assoziativität, isolierter Zustand und Determinismus bilden den technischen Prüfstein für parallele Collectoren. Sie sind nicht optional, sondern grundlegend. Wer sie ignoriert, riskiert schwer zu reproduzierende Fehler, unvollständige Ergebnisse oder performante, aber semantisch falsche Ausgaben.
Parallelität in Java Streams ist mächtig, aber nicht trivial umzusetzen
Beispiele aus der Java-Standardbibliothek: Ein naheliegender Weg, um das abstrakte Konzept paralleler Collectoren greifbar zu machen, führt über die bereits in der Java-Standardbibliothek enthaltenen Collectors. Viele Entwickler nutzen Collectors.toList()
, toSet()
oder joining()
nahezu täglich – selten jedoch im Wissen darum, ob und wie sich diese Collectoren in einem parallelen Kontext verhalten.
Ein einfaches Beispiel: Der Collector Collectors.toList()
nutzt intern eine ArrayList
. Diese ist nicht thread-sicher. Folglich ist das Ergebnis bei paralleler Verwendung potenziell inkonsistent, sofern nicht intern für Isolation der Zwischenspeicher gesorgt ist.
public static
Collector> toList() {
return new CollectorImpl<>(ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
Tatsächlich funktioniert dieser Collector in parallelen Streams dennoch korrekt, weil die Streams-API jedem Thread seinen eigenen Akkumulationsbereich zuteilt und erst am Ende über einen kombinierten Merge-Prozess zusammenführt. Der entscheidende Punkt liegt also nicht in der Datenstruktur selbst, sondern in ihrer kontrollierten Isolierung.
Weniger robust zeigt sich Collectors.groupingBy(...)
. Diese Variante basiert auf einer HashMap
, die nicht für gleichzeitigen Zugriff ausgelegt ist. Wird dieser Collector ohne Schutzmaßnahmen in einem parallelStream()
eingesetzt, drohen Race Conditions. Die Standardlösung dafür lautet Collectors.groupingByConcurrent(...)
, die intern auf ConcurrentHashMap
setzt und somit für gleichzeitigen Zugriff konzipiert ist.
public static
Collector>>
groupingByConcurrent(Function super T, ? extends K> classifier) {
return groupingByConcurrent(classifier, ConcurrentHashMap::new, toList());
}
Ein Blick auf die Signatur dieser Methode zeigt bereits die Intention:
Map> result = namen.parallelStream()
.collect(Collectors.groupingByConcurrent(String::length));
In diesem Beispiel werden Strings nach ihrer Länge gruppiert – in einer parallel verarbeitbaren Weise. Entscheidend ist, dass sowohl die Map-Implementierung als auch der Akkumulationsprozess thread-safe sind.
Ebenso interessant ist Collectors.toConcurrentMap(...)
, der explizit dafür vorgesehen ist, große Mengen von Key-Value-Paaren parallel zu aggregieren. Hier ist die Kombination von Schlüsselkonflikten und der richtige Umgang mit Merge-Funktionen von besonderem Interesse.
Die Erkenntnis aus diesen Beispielen lautet: Nicht jeder Standard-Collector ist per se für Parallelität geeignet. Nur weil eine Methode aus dem Collectors-Baukasten stammt, bedeutet das nicht, dass sie in jeder Ausführungskonfiguration korrekt funktioniert. Der Kontext entscheidet – und mit ihm die verwendete Datenstruktur, das Verhalten des combiner
und die Art der Akkumulation.
Wer also aus einem Stream nicht nur ein beliebiges Ergebnis, sondern ein korrektes und performantes Ergebnis ziehen will, sollte die Wahl seines Collectors ebenso sorgfältig treffen wie das Filterkriterium am Anfang der Pipeline.
Eigene parallele Collector-Implementierungen
So mächtig die vorgefertigten Collectors der Java-Standardbibliothek auch sein mögen, manchmal reichen sie für spezifische Anforderungen nicht aus. Besonders wenn domänenspezifische Aggregationen, spezialisierte Datenstrukturen oder nicht-triviale Reduktionslogik benötigt werden, lohnt sich ein Blick auf die Möglichkeit, eigene Collector-Implementierungen zu erstellen.
In der Regel lässt sich ein eigener Collector mit der statischen Methode Collector.of(...)
erstellen. Diese Methode erwartet fünf Parameter: einen Supplier
, der einen neuen Akkumulator erzeugt; einen BiConsumer
, der ein Element in den Akkumulator einfügt; einen BinaryOperator
zum Kombinieren zweier Akkumulatoren; optional eine Function
zur Konvertierung des Ergebnisses; und schließlich ein Array Collector.Characteristics...
, das Metainformationen wie CONCURRENT
oder UNORDERED
bereitstellt.
Ein einfacher, aber aussagekräftiger Collector könnte etwa Zeichenketten parallel zu einer ConcurrentLinkedQueue
sammeln:
Collector> toConcurrentQueue() {
return Collector.of(
ConcurrentLinkedQueue::new,
Queue::add,
(left, right) -> { left.addAll(right); return left; },
Collector.Characteristics.CONCURRENT, Collector.Characteristics.UNORDERED
);
}
Dieser Collector ist sowohl CONCURRENT
als auch UNORDERED
, das bedeutet: Er kann von mehreren Threads gleichzeitig beschrieben werden, ohne dass die Einfügereihenfolge garantiert werden muss. Wichtig ist dabei, dass ConcurrentLinkedQueue
als thread-sichere Datenstruktur fungiert und die Operation addAll
ebenfalls nebenläufig unkritisch ist.
Doch auch komplexere Szenarien sind denkbar, etwa das parallele Ermitteln von statistischen Kennzahlen (Minimum, Maximum, Durchschnitt) über eine Datenmenge. In solchen Fällen kann ein record
als Akkumulatorstruktur dienen, der in sich bereits alle benötigten Teilzustände kapselt. Der combiner
muss dann lediglich diese Strukturen feldweise konsolidieren.
Eigene Collector-Implementierungen zwingen dazu, sich mit der Parallelisierbarkeit der genutzten Datenstrukturen und der Kombinierbarkeit der Aggregationslogik intensiv auseinanderzusetzen. Das ist kein Nachteil, sondern ein wertvoller Lerneffekt. Denn nur wer versteht, was ein Collector im Inneren macht, kann ihn bewusst und sicher einsetzen.
Best Practices für den produktiven Einsatz
Wer Collectoren im Parallelisierungskontext produktiv einsetzen möchte, sollte einige bewährte Strategien berücksichtigen – nicht als starre Regeln, sondern als Orientierungsrahmen für robuste und effiziente Implementierungen.
Ein erster Grundsatz lautet: Nur parallelisieren, wenn ein echter Nutzen zu erwarten ist. Kleine Datenmengen, triviale Transformationen oder IO-gebundene Prozesse profitieren in der Regel nicht von parallelStream()
. Im Gegenteil: Der Overhead des Thread-Managements kann den potenziellen Performancegewinn sogar übersteigen. Eine Parallelisierung lohnt sich erst dann, wenn die zu verarbeitenden Datenmengen hinreichend groß und die Operationen CPU-intensiv sind.
Zweitens: Nur thread-sichere oder isolierte Datenstrukturen verwenden. Das bedeutet entweder, dass jeder Thread seinen eigenen Akkumulator nutzt – was die Streams-API intern unterstützt – oder dass explizit nebenläufige Datenstrukturen wie ConcurrentHashMap
, ConcurrentLinkedQueue
oder atomare Wrapper eingesetzt werden.
Drittens: Collectors gezielt auswählen. Die Standardbibliothek bietet mit groupingByConcurrent
, toConcurrentMap
oder mapping
leistungsfähige Werkzeuge, die speziell für den parallelen Einsatz konzipiert wurden. Wer darüber hinaus eigene Lösungen entwickelt, sollte besonderes Augenmerk auf den combiner
und die Assoziativität der Logik legen.
Viertens: Ergebnisse validieren – insbesondere bei neuen oder komplexen Pipelines. Parallele Streams verhalten sich nicht deterministisch in der Ausführung, deshalb sind Tests in unterschiedlichen Auslastungsszenarien und unter variierender Last notwendig. Das gilt vor allem dann, wenn Entwicklerinnen oder Entwickler Collectoren selbst entwickeln oder anpassen.
Und nicht zuletzt: Messen statt vermuten. Tools wie JMH (Java Microbenchmark Harness), Flight Recorder oder async-profiler helfen dabei, realistische Aussagen über die Performancevorteile zu treffen. Parallelisierung ohne Metriken ist wie Blindflug mit Rückenwind – vielleicht schneller, aber womöglich in die falsche Richtung.
(Bild: Playful Creatives / Adobe Stock)
Künstliche Intelligenz
Pixel Drop: Google verpasst seinen Pixel-Smartphones Material 3 Expressive
Im Mai hatte Google mit Material 3 Expressive das erste Redesign für Android seit vier Jahren präsentiert. Nun verteilt der Hersteller es für seine Modelle Pixel 6 bis 9, nachdem die Pixel-10-Serie es schon ab Werk installiert hatte. Mit dem Pixel Drop (Android 16 QPR1 (Quarterly Platform Release)) landen neben der Designauffrischung noch ein paar weitere Funktionen auf den Pixel-Geräten.
Mehr Farbe und Gestaltungsfreiheit
Mit Material 3 Expressive setzt Google auf das 2021 eingeführte „Material You“ auf, das eine Fortsetzung des Material Design aus dem Jahr 2014 darstellen soll. Die aufgefrischte Designsprache ziehen mit Android 16 QPR1 und Wear OS 6 zunächst in Pixel-Smartphones und -Smartwatches ein. Schon seit einigen Wochen bereitet Google auf den systemseitigen Umstieg vor, indem zahlreiche hauseigene Apps den neuen Anstrich erhalten. Damit einhergehen etwa größere Buttons und neue Farben.
Googles Anruferansicht unter Android ähnelt in gewisser Weise Apples Kontaktpostern.
(Bild: Google)
Neben der Gmail-App ist das neue Design auch schon in der Google-Telefon-App, Wallet, Drive und weiteren zu sehen. Auch auf seinen Pixel-Watch-Modellen hat der Konzern erste optische Anpassungen vorgenommen, die Material 3 Expressive widerspiegeln. Zudem können Nutzer das Hintergrundbild des Sperrbildschirms nun mit Live-Effekten wie Formen und Wettereffekten versehen.
Lesen Sie auch
Auf Systemebene ziehen mit Material 3 Expressive Änderungen in den Schnelleinstellungen ein, deren einzelne Kacheln nun in verschiedenen Größen dargestellt werden können. Außerdem setzt Google bei den Schnelleinstellungen, Benachrichtigungen und dem App-Drawer auf einen teilweise transparenten Hintergrund, der wie Milchglas wirkt. Zudem ziehen neue Animationen ein, die „natürlicher, federnder“ anmuten und „alltägliche Routinen auflockern“ sollen. Wenn zum Beispiel eine Benachrichtigung ausblendet wird, reagieren die danebenliegenden Benachrichtigungen auf die Interaktion. Die neuen Animationen werden durch haptisches Feedback und Ton untermalt.
Was noch?
Laut Google sollen später im September noch weitere Funktionen für die Pixel Buds Pro 2 wie „Adaptive Audio“ erscheinen. Damit sollen sich die Kopfhörer „intelligent“ an die Umgebung anpassen, sodass Träger und Trägerinnen „aufmerksam bleiben und gleichzeitig Musik oder Podcast hören“ können. Des Weiteren kommt der Schutz vor lauten Geräuschen hinzu, der das Gehör schonen kann.
Zudem können Nutzer mit den Pixel Buds Pro 2 Gespräche mit Gemini führen, etwa wenn der Fernseher läuft oder Menschen sich um den Träger herum unterhalten. Mit dem Update soll es ähnlich wie bei Apples Airpods möglich sein, eingehende Anrufe anzunehmen oder abzulehnen, ohne die Hände zu benutzen – ein Nicken oder Kopfschütteln genügt, so Google. Des Weiteren wird es möglich sein, die Navigation für Fußgänger oder Radfahrerinnen auf dem Smartphone zu initiieren, und Google Maps wird automatisch auf der Pixel Watch angezeigt.
Teil des Updates sollten eigentlich noch die Live-Updates sein, die Google in der Ankündigung nicht erwähnt. Daher ist ungewiss, ob sie nun an Bord sind oder nicht. Mit den Live-Updates können etwa Fortschrittsbenachrichtigungen von ausgewählten Liefer-, Mitfahr- und Navigations-Apps in Echtzeit im Sperrbildschirm oder in der Statusleiste verfolgt werden. Sie erinnert ein wenig an Apples Live-Aktivitäten, jedoch ist das Feature auf Android funktional stärker eingeschränkt.
Die neue Android-Version kann auf Googles Smartphones ab dem Pixel 6 installiert werden. Auch das Pixel Fold, 9 Pro Fold und das Pixel Tablet sind kompatibel.
(afl)
Künstliche Intelligenz
Fab in China: USA streichen Exporterleichterung für TSMC
Die US-Regierung widerruft nun auch die Exportgenehmigungen für den chinesischen Standort von Chipfertiger Taiwan Semiconductor Manufacturing Company (TSMC). Wie zuvor bei Intel, Samsung und SK Hynix läuft die Ausnahmeregelung für TSMC zum Jahresende aus.
„Betrieb sicherstellen“
TSMC bestätigte gegenüber verschiedenen Medien, von der US-Regierung über den Ablauf der Blanko-Exportgenehmigung für die Fab in Nanjing informiert worden zu sein. Das Unternehmen habe die erforderlichen Schritte eingeleitet und bleibe mit der US-Regierung im Austausch, heißt es. Das Unternehmen arbeite weiter daran, „den unterbrechungsfreien Betrieb von TSMC Nanjing sicherzustellen“.
Mit der Einstufung der Fab in Nanjing als „Validated End User“ (VEU) konnte TSMC US-Technologie für den chinesischen Standort einkaufen, ohne dafür jedes Mal eine Exportgenehmigung erhalten zu müssen. Dieser Status wird dem Standort nun entzogen.
Ab dem Jahreswechsel kann TSMC zwar weiter Technologie einführen, die in den USA Exportbeschränkungen unterliegt. Dafür benötigt das Unternehmen dann aber jeweils einzelne Ausfuhrgenehmigungen. Das könnte den Betrieb der Fab beeinträchtigen.
Börse bleibt entspannt
Die Börse reagierte dennoch milde auf die Nachricht. In Nanjing produziert TSMC Chips im 16-nm-Verfahren und andere ältere Halbleiter. Der Standort trug im Geschäftsjahr 2024 nur rund 2,4 Prozent zum Gesamtumsatz des Unternehmens bei. TSMC hatte bereits in seinem Geschäftsbericht gewarnt, dass die Ausnahmegenehmigung jederzeit widerrufen werden kann.
Zuvor hatte die US-Regierung den VEU-Status für chinesische Niederlassungen von Intel, Samsung und SK Hynix einkassiert. Auch für diese drei Hersteller gilt ab Januar 2026, dass sie für Exporte von US-Technologie an ihre chinesischen Standorte eine Genehmigung benötigen.
(vbr)
Künstliche Intelligenz
Oberlandesgericht: E-Mail-Anbieter muss keine Auskunft über Bestandsdaten geben
Ein E-Mail-Hosting-Service wie Google ist nicht dazu verpflichtet, Auskunft über die persönlichen Daten seiner Nutzer zu erteilen. Das gilt selbst dann, wenn ihm zurechenbare E-Mail-Adressen für die Veröffentlichung rechtswidriger Inhalte auf einer anderen Plattform genutzt wurden. Das hat das Oberlandesgericht (OLG) München in einem jetzt veröffentlichten Beschluss vom 26. August klargestellt (Az.: 18 W 677/25 Pre e). Dabei hat es die Entscheidung der Vorinstanz, des Landgerichts München I, vom Februar aufgehoben (Az.: 25 O 9210/24).
In dem Fall wurde ein deutsches Unternehmen aus der Automobilbranche auf einer Online-Plattform, auf der aktuelle und ehemalige Mitarbeiter, Bewerber und Lehrlinge europaweit Arbeitgeberbewertungen abgeben können, in mehreren Beiträgen unter Aufhängern wie „Außen hui innen pfui“ negativ dargestellt. Laut der Kölner Kanzlei LHR Rechtsanwälte handelt es sich dabei um Kununu.
Das Automobilunternehmen sah darin unwahre Tatsachenbehauptungen enthalten und vermutete Straftatbestände wie üble Nachrede oder Verleumdung. Das Unternehmen verlangte von der Plattform Auskunft über die Verfasser der Bewertungen. Diese gab als einzige Information die E-Mail-Adressen der Verfasser heraus, da sie keine weiteren Bestandsdaten gespeichert habe.
Um an die persönlichen Informationen der Ersteller der umstrittenen Beiträge – insbesondere Name und Anschrift – zu gelangen, wandte sich die Firma an den E-Mail-Hosting-Service, der diese E-Mail-Adressen bereitstellte. Es handle sich um den Betreiber des Dienstes „G…mail“.com, ließ das Landgericht in seinem ursprünglichen Beschluss durchblicken. LHR nennt Google als Provider. Der US-Konzern weigerte sich aber, die Daten herauszugeben.
Keine „Kettenauskunft“
Nachdem das Münchener Landgericht den E-Mail-Dienst zur Herausgabe der Daten verpflichtet hatte, legte Google erfolgreich Beschwerde beim OLG ein: dieses wies den Antrag auf Auskunft zurück. Die höhere Instanz stellte in ihrem Beschluss klar, dass das Telekommunikation-Digitale-Dienste-Datenschutz-Gesetz (TDDDG) – und damit die Grundlage, auf die sich die klagende Firma berief – auf den E-Mail-Anbieter nicht anwendbar ist. Die entscheidende rechtliche Abgrenzung liegt demnach zwischen digitalen Diensten wie Foren, Bewertungsplattformen und sozialen Netzwerke auf der einen sowie Telekommunikationsdiensten wie Telefonie, Chat und E-Mail-Diensten auf der anderen Seite.
Das OLG ordnete den E-Mail-Provider als interpersonellen Kommunikationsdienst ein, der in den Geltungsbereich des Telekommunikationsgesetzes (TKG) fällt. Während das TDDDG unter bestimmten Umständen eine Pflicht zur umstrittenen Bestandsdatenauskunft für digitale Dienste vorsieht, bestehen für Telekommunikationsdienste andere Regelungen. Gemäß Paragraf 174 TKG existiert eine Auskunftspflicht zwar gegenüber Behörden wie der Polizei oder Staatsanwaltschaft, jedoch nicht gegenüber Privatpersonen oder Unternehmen.
Zudem betonte das OLG München, dass Google nicht direkt an der Rechtsverletzung in Form der negativen Bewertungen beteiligt war. Die schädlichen Inhalte seien nicht auf Webseiten des Providers, sondern auf der separaten Bewertungsplattform verbreitet worden. Das OLG arbeitete hier heraus, dass auch das TDDDG eine „Kettenauskunft“ von einem Dienst zum nächsten – also hier von dem Bewertungsportal zum E-Mail-Service – nicht vorsehe. Der Gesetzgeber habe im TDDDG klargestellt, dass nur derjenige Dienstanbieter zur Auskunft verpflichtet sei, dessen Dienst direkt für die Rechtsverletzung genutzt wurde.
Eine bewusste Gesetzeslücke
Das OLG erkannte ferner, dass diese Einordnung eine rechtliche Schutzlücke schafft: Wenn eine Plattform keine weiteren Daten als eine E-Mail-Adresse hat, kann das Opfer einer Verleumdung keine zivilrechtlichen Ansprüche gegen den Verfasser durchsetzen. Das Gericht stellte jedoch klar, dass dieser Hohlraum nicht durch eine anlasslose Ausweitung der Auskunftspflicht auf andere Dienstleister geschlossen werden dürfe. Es verwies auf geplante Gesetzesänderungen, die eine solche Lücke durch die erweiterte Auskunftspflicht über IP-Adressen schließen sollen.
Die Entscheidung ist noch nicht rechtskräftig. Da der Beschluss von grundlegender Bedeutung für die rechtliche Abgrenzung von Online-Diensten ist und eine höchstrichterliche Klärung bisher aussteht, hat das OLG die Rechtsbeschwerde zugelassen. Damit ist der Weg prinzipiell frei für ein Urteil des Bundesgerichtshofs (BGH).
(vbr)
-
Datenschutz & Sicherheitvor 3 Monaten
Geschichten aus dem DSC-Beirat: Einreisebeschränkungen und Zugriffsschranken
-
UX/UI & Webdesignvor 2 Wochen
Der ultimative Guide für eine unvergessliche Customer Experience
-
Apps & Mobile Entwicklungvor 3 Monaten
Metal Gear Solid Δ: Snake Eater: Ein Multiplayer-Modus für Fans von Versteckenspielen
-
Online Marketing & SEOvor 3 Monaten
TikTok trackt CO₂ von Ads – und Mitarbeitende intern mit Ratings
-
UX/UI & Webdesignvor 4 Tagen
Adobe Firefly Boards › PAGE online
-
Social Mediavor 2 Wochen
Relatable, relevant, viral? Wer heute auf Social Media zum Vorbild wird – und warum das für Marken (k)eine gute Nachricht ist
-
Entwicklung & Codevor 2 Wochen
Posit stellt Positron vor: Neue IDE für Data Science mit Python und R
-
Digital Business & Startupsvor 2 Monaten
10.000 Euro Tickets? Kann man machen – aber nur mit diesem Trick