Thread; Ist es nicht eine Kopie der Variablen jedes Mal, als die Schaffung der gleiche?

StackOverflow https://stackoverflow.com/questions/873704

  •  22-08-2019
  •  | 
  •  

Frage

Ich bin immer noch der Begriff der Thread verwirrt. Ich habe die JavaDoc lesen, und andere damit zusammenhängende Fragen gepostet hier, aber die Jargons verwendet und alle halfen mir nicht viel.

Ich bekomme Art die Idee des Thread, das heißt, jeder Thread seine eigene Kopie der Variablen hat. So ..., wie dies macht es anders sagen ... das neue Variable jedes Mal konstruieren?

Zum Beispiel mit DateFormatter als Beispiel:

public void convertDate(String date) 
{ 
    // Contruct new date formatter for every invocation of the method.
    DateFormatter df = new SimpleDateFormatter(...);
    ....
}

public void convertDate(String date) 
{ 
    // Getting date formatter from threadlocal.
    DateFormatter df = threadLocal.get();
    ....
}

Wie aus der zweiten der ersten verschieden ist, wenn die ganze zweite nicht nur eine neue Kopie der Variablen zurückkehren?

Danke.

War es hilfreich?

Lösung

Thread Objekte sind typischerweise statisch, was bedeutet, dass sie ihre Werte beibehalten zwischen Funktion innerhalb des gleichen Thread aufruft.

In Ihrem ersten Codeausschnitt wird jedes Mal convertDate genannt, ein neues SimpleDateFormatter Objekt erstellt. Im zweiten Schnipsel wird ein SimpleDateFormatter Objekt pro Thread erstellt. Das gleiche Ziel wird durch das Verfahren zurückgeführt get() jedes Mal convertDate innerhalb der gleichen Thread aufgerufen wird.

Thread Objekte nützlich sind bei der Umsetzung der Thread-Local Storage , was bedeutet Aufrechterhaltung separate Instanzen von Variablen für jeden Thread.

Andere Tipps

Es gibt ein paar verschiedene Verwendungen für ThreadLocal.

Wie in Ihrem Beispiel ein teurer zu konstruieren, fades unsicheren Objekt kann zwischengespeichert werden. Das Objekt kann dann als jede Nutzung ohne den Aufwand des Aufbaus in einer sicheren Weise verwendet werden. Es ist nicht unbedingt ein Gewinn (mehr, nicht-lokale Speicher verwendet wird, zum Beispiel), aber es könnte sein.

Es kann auch zu ‚Sleaze‘ über einen Kontext Argument in einen Callback verwendet werden, die nicht dafür ausgelegt ist Kontext zu haben. Oder einfach nur, um Schnittstellen einfacher. In diesem Fall auf den ThreadLocal die kanonische Referenz ist wahrscheinlich nicht statisch. Das Objekt kann auch bewusst wandelbar sein. Ich bin kein großer Fan von dieser Technik zu fördern, aber einige Leute (wie „verrückt“ Bob Lee), wie es.

ThreadLocal nicht so gut funktioniert, wenn Sie Gabel Aufgaben in mehrere Threads aus. InheritableThreadLocal scheint keinen guten Gebrauch zu haben.

Sie zwei Beispiele sind die gleichen iff das zweite Verfahren in einem anderen Thread jedes Mal aufgerufen wird. In diesem Fall ist das erste Beispiel ist effizienter.

Wenn Sie jedoch die gleiche Methode mehr nennen als einmal im selben Thread, wird der Wert für diesen Thread-Cache und nicht ein neues Objekt jedes Mal erstellen müssen. (Die meisten des Objekts Daten beziehen, sind ziemlich teuer ist, welcher Fall es sich lohnen kann tun) In diesem Fall gibt es einen kleinen Leistungsvorteil in das gleiche Objekt in einem Thread erneut verwenden.

Hinweis: die lokalen Thread-Objekte in einer Karte sind die Speicherung an das Thema selbst. Wenn der Thread stirbt, werden alle Objekte lokal zu diesem Thread sind GCed. Dies ist, wo Thread kann als die meisten Caches einfacher sein.

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