2010-12-29 3 views
0

Ich habe eine normale Klasse entwickelt, um von einem einzigen Thread zugegriffen werden, und ich möchte es thread-safe machen, so viele Threads können eine einzelne Instanz zur gleichen Zeit verwenden. Es gibt einige Methoden und Variablen auf Klassenebene, die ich statisch machen und mit locks zu thread-safe machen werde. Auch Methoden, die nur verwenden lokale Variablen sind sicher (jeder Thread hat seinen Stack) standardmäßig.Machen Sie thread-safe eine normale Klasse mit ThreadLocal <T>

Meine Frage es über properties der alten Klasse oder allgemeiner non-static Variable. Kann ich einfach ThreadLocal<T> verwenden und jeder Thread hat seinen eigenen Satz von properties? Sicherlich werde ich locks und andere thread-safety Probleme innerhalb setters verwenden (ich nehme an, getters sind sicher).

Und ist ThreadLocal<T> Leistungskiller?

+1

Ohne zu beschreiben, was diese Klasse tut, und warum es Störungen durch mehrere Threads geben würde, kann Ihnen niemand eine gute Antwort geben. – Anon

+2

Was glauben Sie genau, dass ThreadLocal funktioniert? Weil ich nicht denke, dass es tut, was du denkst, dass es tut. Können Sie erklären, warum Sie der Meinung sind, dass lokaler Thread-Speicher die richtige Lösung ist? –

+0

@Eric: Ich lese es macht eine Variable lokal zu einem Thread. Wir haben also so viele Eigenschaften wie die Anzahl der laufenden Threads. Das Objekt kann also einen Status pro Thread haben. – Xaqron

Antwort

1

Das ist nicht wirklich, was Thread Locals sind. Sie sind für Fälle gedacht, in denen jeder Thread seine eigenen Daten hat.

In Ihrem Fall würde ich empfehlen, den Feldtyp auf Map<Object, Object> und Collections.synchronizedMap zu ändern, um es threadsicher zu machen.

+0

Oder ConcurrenthashMap;) –

+0

jemand 'Java' hinzugefügt, um Tags (editiert) zu fragen. Dies ist eine 'C#' Klasse. – Xaqron

2

Getters sind nicht so sicher wie Sie denken. Das Java-Speichermodell gibt jedem Thread seine eigene Ansicht des Heapspeichers. Wenn Sie also den Zugriff auf Variablen nicht synchronisieren, können Threads möglicherweise veraltete Daten lesen. Das Erstellen einer Variablen volatile verhindert veraltete Lesevorgänge und ist für primitive Elemente in Ordnung, aber volatile macht keinen atomaren Zugriff.

Es gibt eine Reihe von Klassen in der java.util.concurrent-Paket, die Ihnen helfen können. Thread-sicheren Code zu schreiben ist knifflig, also würde ich empfehlen, ein gutes Buch zu diesem Thema zu bekommen. Brian Goetz's "Java-Parallelität in der Praxis" ist ziemlich gut.

+0

thisPostUpvotes ++; – Rekin

+0

Jemand hat Java zu Frage-Tags hinzugefügt (bearbeitet). Dies ist eine C# -Klasse. – Xaqron

+0

Ah. Nun, wenn Sie jemals etwas in Java tun, dann denken Sie an die Erinnerung. –