Warum sind Struts Aktionsklassen nicht threadsicher?

7

Ich kann auf vielen Websites lesen, dass Struts Action-Klassen nicht Thread-sicher sind. Ich kann nicht verstehen, warum das so ist.

Ich lese auch ein Buch, das sagt "Struts Aktionsklassen werden zwischengespeichert und für die Performance wiederverwendet Optimierung auf Kosten der aktionssicheren Implementierung der Aktionsklassen "

Wie ist Caching Aktionsklassen und thread sicher verwandt? .

    
Vinoth Kumar C M 17.02.2011, 18:38
quelle

4 Antworten

23
  

Wie sind Caching-Aktionsklassen und Thread-sicher verwandt?

Wenn Sie Instanzen einer Klasse zwischenspeichern und wiederverwenden, sodass mehrere Threads gleichzeitig auf dieselbe Instanz zugreifen können, ist die Klasse von Natur aus nicht thread-safe *. Wenn Sie veränderbare Instanzen oder statische Felder in der Klasse platzieren würden, wären die Ergebnisse unter Parallelität unerwartet und problematisch. Auf der anderen Seite, wenn jeder Thread seine eigene Instanz der Klasse hat, dann ist die Klasse inhärent threadsicher.

  • Struts 1-Action-Klassen sind nicht Thread-sicher. Sie sollten keine änderbaren Felder in der Klasse platzieren, sondern eine Form Bean-Klasse für Formularfelder verwenden, die an die Aktion übergeben werden.
  • Struts 2-Action-Klassen sind Thread-sicher. Neue Kopien werden für jede Anfrage instanziiert und das Platzieren von Instanzfeldern in der Klasse ist ein Kernkonzept im Framework.

* Wenn die Instanz oder das statische Feld unveränderlich ist, dann ist es sinnvoll, wenn mehrere Threads gleichzeitig darauf zugreifen.

    
Steven Benitez 17.02.2011, 22:14
quelle
5

Wenn eine Klasse zwischengespeichert und wiederverwendet wird, besteht die Gefahr der Beschädigung durch gleichzeitige Zugriffe durch mehrere Threads. In einer Webanwendung wird jede Anforderung in einem Thread behandelt. Nehmen wir an, Sie haben 10 Instanzen einer Aktion, aber Ihr Container bearbeitet 20 Anfragen - in diesem Fall werden Ihre 10 Aktionen wiederverwendet, weil Sie mehr Anfragen im Flug haben als verfügbare Aktionen, um sie zu bedienen.

Das Threadsicherheitsproblem wird nur dann wieder angezeigt, wenn ein Zustand vorhanden ist, der in der Aktion wiederverwendet wird. Wenn dies der Fall ist, kann eine Aktion, die eine Anfrage bearbeitet, einen Wert in der gemeinsam genutzten Variablen festlegen, aber dann kann ein anderer Thread die Funktion übernehmen und die Aktion kann die freigegebene Variable erneut ändern. In diesem Fall, wenn der ursprüngliche Thread übernimmt, wurde der gemeinsame Status geändert.

Der einfachste Weg, dies zu umgehen, besteht darin, Ihren Stack so zu konfigurieren, dass immer nur eine neue Aktion verwendet wird oder dass Sie in Ihren Aktionen keinen gemeinsamen Status haben.

    
hvgotcodes 17.02.2011 18:57
quelle
2

Warum nicht ein neues "Action" -Objekt pro Anfrage erstellen? Was in der Welt?

Da Struts so alt ist, ist er der Meinung, dass die Erstellung eines weiteren Objekts pro Anfragezyklus so teuer ist wie die Zahlung eines Dollars für einen Kaffee. (Das ist sehr teuer, weil er wirklich alt ist.)

    
irreputable 17.02.2011 19:10
quelle
1

Wenn Sie die Quelle der tatsächlichen Struts betrachten, sehen Sie, dass sie instanziierte Action-Klassen zurückgibt. So können zwei Anfragen die gleiche Instanzvariable treffen, was zu vielen Problemen führt, wenn sie nicht korrekt synchronisiert wird.

%Vor%     
Shawn 06.02.2012 16:24
quelle

Tags und Links