Frage

Naiv, erwartete ich eine Thread eine Art WeakHashMap des Thread auf den Wert Typen zu sein. So war ich ein wenig verwirrt, als ich erfuhr, dass die Werte eines Thread ist eigentlich in einer Karte im Thread gespeichert. Warum war es so gemacht? Ich würde erwarten, dass die Ressourcenlecks rel="nofollow im Zusammenhang mit Thread würde nicht da sein, wenn die Werte werden in dem Thread selbst gespeichert.

Zur Verdeutlichung: Ich dachte an so etwas wie

public class AlternativeThreadLocal<T> { 
    private final Map<Thread, T> values = 
        Collections.synchronizedMap(new WeakHashMap<Thread, T>());
    public void set(T value) { values.put(Thread.currentThread(), value); }
    public T get() { return values.get(Thread.currentThread());}    
}

Soweit ich das sehen kann, würde das seltsame Problem verhindern, dass weder der Thread noch davon übrig ist über Werte immer Garbage Collection sein könnten, bis der Thread stirbt, wenn irgendwie der Wert stark der Thread selbst verweist. (Wahrscheinlich die hinterhältige Form dies geschieht, wenn die Thread eine statische Variable der Wert Verweise auf eine Klasse ist. Jetzt haben Sie eine große Ressource-Leck auf Umschichtungen in Anwendungsservern, da weder die Objekte noch ihre Klassen gesammelt werden können.)

War es hilfreich?

Lösung

Manchmal muss man erleuchtet wird durch nur eine Frage zu stellen. :-) Nun sah ich nur eine mögliche Antwort: Thread-Sicherheit. Wenn die Karte mit den Werten in dem Thread-Objekt ist, ist das Einfügen eines neuen Wertes trivially threadsicher. Wenn die Karte auf dem Thread ist haben Sie die üblichen Parallelitätsprobleme, die Dinge verlangsamen könnte. (Natürlich würden Sie eine ReadWriteLock statt synchronisieren verwenden, aber das Problem bleibt.)

Andere Tipps

Sie scheinen das Problem der Thread Lecks zu Missverständnissen. Thread Lecks auftreten, wenn der gleiche Thread wiederholt verwendet wird, wie beispielsweise in einem Thread-Pool, und der Thread Zustand nicht zwischen Verwendungen gelöscht. Sie sind nicht eine Folge des Thread verbleibt, wenn der Faden zerstört wird, weil nichts die Thread Karte verweist neben dem Faden selbst.

eine schwache Referenzkarte von Gewinden Objekte einzufädeln-local würden nicht das Thread Leck Problem vermeiden, da der Thread existiert noch im Thread-Pool, so dass die lokalen Thread-Objekte sind nicht teilnahmeberechtigt für die Sammlung, wenn der Faden von der wiederverwendet wird Schwimmbad. Sie würden immer noch manuell müssen, um den Thread deaktivieren Sie das Leck zu vermeiden.

Wie Sie in Ihrer Antwort, sagte, Concurrency Control mit der Thread Karte ist eine einzelne Instanz pro Thread vereinfacht. Es macht es auch unmöglich, einen Thread eines andere lokale Objekte Thread zuzugreifen, was nicht der Fall sein könnte, wenn der Thread Objekt eine API auf der Karte ausgesetzt vor.

Ich erinnere mich, vor einigen Jahren Sun die Umsetzung des Thread Einheimischen zu seiner jetzigen Form verändert. Ich erinnere mich nicht, welche Version es war und was der alte impl war wie.

Wie auch immer, für eine Variable, die jeder Thread einen Steckplatz für, Gewinde haben soll, sind die natürlichen Behälter der Wahl. Wenn wir könnten, würden wir auch unseren Thread lokale Variable direkt als Mitglied der Thread-Klasse hinzufügen.

Warum wäre die Map auf ThreadLocal? Das macht nicht viel Sinn machen. So es wäre eine Karte von ThreadLocals auf Objekte in einem Thread sein?

Der einfache Grund ist es eine Karte von Threads zu Objekten ist, weil:

  1. Es ist eine Implementierung Detail dh dass Map nicht in irgendeiner Weise ausgesetzt ist;
  2. Es ist immer einfach, den aktuellen Thread (mit Thread.currentThread()) zu verstehen.

Auch ist die Idee, dass ein Thread einen anderen Wert für jeden Thread speichern kann, die es verwendet, so macht es Sinn, dass sie auf Thema basiert, nicht wahr?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top