Instanz-Variablen in Java-Spring-Bean
Entwickle ich eine Java Spring MVC Projekt und ich zögere, die Instanz-variable in Java-Spring-Bean.Ich möchte bitten, einige Fragen zu diesem Thema.
Habe ich eine Instanz-variable in meinem Java-Spring-Bean und sein Typ ist String.
private String abc = "hell";
Wie wir wissen , Java-Spring Standard-Umfang ist ein Singleton, und Sie sind konstruiert, bei der die Start-Zeit des Projekts. .Es ist eine einzige Instanz, und meine Instanz-variable muss thread-sicher.
Habe ich diese variable "abc" in die Methoden der Bohnen und, wenn Sie erreicht sind, die von mehreren threads wird es beschädigt die Konsistenz der Daten in jedem thread?
Für ein Beispiel Thread 1 erreichen die Bohne und nehmen Sie die abc-variable geändert, es als "Hallo".Auf, die Zeit , Thread 1 Verweis auf abc variable Punkt "Hölle" oder "Hallo"? Ich bin verwirrt bei diesem Thema.
Ich die Zeichenfolge abc variable ThreadLocal
Objekt zu sorgen, dass jeder thread besitzt eigenen abc-variable.Aber ich habe gelesen, dass mit ThreadLocal
Objekte tritt ein Speicher-Leck in der Tomcat.Nach der 7.0-version von Tomcat es wird gesagt, dass es behoben wird.
Weil jeder thread besitzt eigene variable, und wenn Ihre Aufgabe beendet ist, kehren Sie die thread-pool, der vom container verwaltet wird.Aber,Rücksendung der pool , ThreadLocal-Objekt wird nicht zerstört, und Sie verursachen Speicherlecks.
Darüber hinaus String-Objekt unveränderlich ist, so in theorical Sicht muss es dazu führen, dass die multi-Threading-problem ??
ist jeder thread besitzt Ihre String-variable auf seinen eigenen? Zum Beispiel, Gewinde-1-Trigger und starten Sie dann die Methode invocation , und erstellen Sie separate String-variable "abc" und Thread 2 auslöst dann wird der neue String-variable "abc" und tun Sie Schaden "abc" variable jedes andere?
Ich Frage mich wirklich, dieses Konzept der Nutzung und begierig zu lernen die Antworten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich versuchen, Ihre Fragen einzeln.
Die kurze Antwort auf diese Frage "ja". Wenn Sie schrieb einen anderen Wert für
abc
in einemThread
es kann oder nicht gesehen werden, aus einem anderen thread. Dies ist der Grund, warum dievolatile
Stichwort eingeführt wurde.Ich Sie haben will veränderlich singleton-beans in
Spring
dann müssen Sie vorsichtig sein mit der Synchronisation und verwenden vonvolatile
.Die Daten werden nicht "verdorben", weil, wie Sie darauf hinweisen,
String
unveränderlich ist. Aber ein thread kann nicht sehen, dass ein anderer verändert hat, der Wert derabc
.So haben Sie eine variable
abc
;abc
= "Hallo".abc
als "Hallo"..abc
schriftlich an die Referenz:abc="Hello."
abc
es ist unklar, obabc
liest "Hi." oder "Hallo"..ThreadLocal
wird verwendet, um jeden thread eine andere Instanz der variable. Dies wird Häufig verwendet, zum binden Zustand zu einem thread in einem web-server als web-Server, verwenden Sie einen thread, pre-request Modell.Tomcat 7 nicht fix
ThreadLocal
Leck Fragen. Wenn Sie nicht entfernen Sie die variable, die Sie gesetzt haben, aus einem thread, dann ist es wird ein Leck verursachen. Oder, noch schlimmer, einer Anfrage Positionen aus dem Kontext der anderen Anfrage. Dies geschieht, wenn ein thread überprüft in den pool mit context Links in seineThreadLocal
und dann ausgecheckt von einem anderen verlangen.Tomcat 7 Reifen zu erkennen, diese Probleme und die swap-threads fallen Ihre
ThreadLocal
Variablen. Diese sind teuer und können vermieden werden, indemThreadLocal
richtig.Müssen Sie klar
ThreadLocal
Variablen in einen servlet-filter.Also:
Wenn Sie eine variable
abc
dass Sie möchten, schreiben in einem thread, und für das ändern nicht gesehen worden in anderen threads, dann können Sie einenThreadLocal
, aber Sie müssen sehr vorsichtig sein, zu klaren Zustand nach jeder Anfrage.Wenn Sie eine variable
abc
dass yo wollen, schreiben Sie in einem Faden, und für das ändern zu sehen in anderen threads, dann können Sie eine singleton-bean mit einervolatile
variable.Ich denke, in Ihrem Fall, wenn Sie definieren den Umfang Ihrer Bohne, die hat Ihre Instanz-Variablen als
Singleton
das tun sollte.Als pro Frühjahr Referenz-Dokument, unten ist die definition des Singleton-scoped bean.
Singleton
ist der Standardbereich, dass Ihr bean umgesetzt, wenn Sie nicht angeben.Auch, unter Anweisung sollte im Auge behalten werden, wenn Sie versuchen, behandeln Ihren Fall mit Spring-bean-scope-Ansatz.
prototype
welche Bereiche einer einzelnen bean-definition, um eine beliebige Anzahl von InstanzenSingleton
scope-Bereiche einer einzelnen bean-definition auf ein einzelnes Objekt-Instanz pro Spring IoC container. Bin dabei mit der Anzahl der Instanzen, die angelegt wird, mit Bereichen.prototype
Bereich oder andere Bereiche mitvolatile
variable ? Bitte korrigieren Sie mich..