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? .
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.
* Wenn die Instanz oder das statische Feld unveränderlich ist, dann ist es sinnvoll, wenn mehrere Threads gleichzeitig darauf zugreifen.
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.
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.)