3 Stimmen

Gemeinsame Nutzung einer ThreadLocal-Variable in Java

In meiner kleinen Anwendung habe ich Threads von zwei Klassen - im Wesentlichen Schreiber und Leser. Einem Writer können mehrere Leser zugewiesen werden. Ein Writer interagiert mit seinen Lesern, indem er in deren chunkBuffer variabel.

Nun, ich kann nicht ganz meinen Kopf um den Thread Sicherheit Problem hier: wenn ich nicht speichern die chunkBuffer in einer statischen ThreadLocal Variable, teilen sich alle Leser einen einzigen chunkBuffer, was schlecht ist. Aber wenn ich den chunkBuffer in einer statischen ThreadLocal wird der Writer, der ein separater Thread ist, seine eigene Kopie des chunkBuffers erhalten und weiter in diesen schreiben, während keine der von ihm geschriebenen Daten die Leser erreichen werden. Können Sie mir erklären, was hier das Problem ist? Ich danke Ihnen vielmals.

編集部 Mit anderen Worten, gibt es eine Möglichkeit, ein Feld zu erstellen, das für jede einzelne Instanz einer Thread-Unterklasse (wie ThreadLocal) eindeutig ist, aber bei Bedarf von anderen Threads aufgerufen werden kann?

2voto

helios Punkte 13224

Nö.

ThreadLocal ist für Thread-private Daten. In Ihrem Fall benötigen Sie Objekte für kommunizieren Sie benötigen also andere Arten von Objekten.

Ich denke, die beste Struktur ist die der syncrhonisierten Warteschlangen: java.util.concurrent.LinkedBlockingQueue<E> .

Warteschlangen ermöglichen es einem Produzenten, Daten einzufügen und einem Konsumenten, diese zu konsumieren. Wenn sie synchronisiert sind, kann dies von verschiedenen Threads aus geschehen, ohne die Struktur zu unterbrechen.

Sie können eine Warteschlange gemeinsam mit den zugehörigen Autoren/Lesern nutzen:

Writer 1 -> queue 1 -> [readers A/B/C]

Writer 2 -> queue 2 -> [readers D/E/F]

Jeder Autor und jeder Leser wird seinen eigenen roten Faden haben. Jeder Leser wird versuchen, ein Element aus seiner Warteschlange zu nehmen, wobei er blockiert wird, wenn keine Elemente vorhanden sind. Wenn Sie Ihre Leser klüger verwalten müssen, können Sie einen ausgefeilteren Ansatz versuchen, aber ich denke, es ist ein guter Ausgangspunkt.

0voto

Ich glaube nicht, dass Sie eine ThreadLocal-Variable verwenden möchten. Sie brauchen wirklich einen Benachrichtigungsmechanismus.

Writer macht Folgendes:

  1. Schreiben Sie an einen Leser chunkBuffer
  2. Benachrichtigung des Lesers über neue Daten.

Es gibt viele Möglichkeiten, dies in der Java-Gleichzeitigkeit Zeug zu tun, aber was ist in der Regel die einfachste und sicherste ist es, eine ArrayBlockingQueue . In Ihrem Anwendungsfall klingt es so, als hätte jeder Reader seine eigene ArrayBlockingQueue und muss lediglich die Warteschlange ablesen.

Das hängt natürlich von Ihrem Anwendungsfall ab. Ist es notwendig, immer mit den neuesten Daten zu arbeiten, oder müssen Sie bei jedem Schreibvorgang auf chunkBuffer ? Diese Fragen sind notwendig, um herauszufinden, welchen Mechanismus Sie benötigen.

Anmerkung: Ein Lob an @helios für die Erwähnung synchroner Warteschlangen, ich hoffe, meine Antwort bringt einen Mehrwert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X