Dlaczego serwlety nie są bezpieczne dla wątków? [duplikat]

To pytanie ma już odpowiedź tutaj:

Muszę wiedzieć dlaczego serwlety nie są bezpieczne? A dlaczego w Struts 2.0 Framework controller servlet jest bezpieczny ?

 27
Author: Roman C, 2012-03-04

6 answers

muszę wiedzieć, dlaczego serwlety nie są bezpieczne dla wątków ?

Instancje serwletów nie są z natury bezpieczne dla wątków ze względu na wielowątkową naturę języka programowania Java w ogóle. Maszyna wirtualna Java obsługuje wykonywanie tego samego kodu przez wiele wątków. Jest to świetna korzyść z wydajności na komputerach, które mają wiele procesorów. Pozwala to również na wykonanie tego samego kodu przez wielu jednoczesnych użytkowników bez blokowania każdego z nich inne.

Wyobraź sobie serwer z 4 procesorami, w którym zwykły servlet może obsłużyć 1000 żądań na sekundę. Gdyby ten servlet był threadsafe, to aplikacja webowa zachowywałaby się tak, jakby działała na serwerze z 1 procesorem, w którym servlet może obsłużyć tylko 250 żądań na sekundę(OK, to nie jest dokładnie w ten sposób, ale masz pomysł).

Jeśli napotkasz problemy z threadsafety podczas korzystania z servletów, to jest to twoja wina , a nie Java ani Servlet. Trzeba by naprawić kod servletu w taki sposób, że dane o zasięgu żądania lub sesji nie są nigdy przypisywane jako zmienna instancji servletu. Aby uzyskać szczegółowe wyjaśnienie, Zobacz także jak działają serwlety? Tworzenie instancji, sesje, współdzielone zmienne i wielowątkowość .

A dlaczego w Struts 2.0 Framework controller servlet jest bezpieczny ?

Nie jest bezpieczny dla wątków. Dezorientujesz dyspozytora Struts servlet filtruj za pomocą rozpórek. Akcje struts są ponownie tworzone na każdym pojedynczym żądaniu. Tak więc każde żądanie ma własną instancję akcji request scoped Struts. Filtr Struts dispatcher servlet nie przechowuje ich jako własnej zmiennej instancji. Zamiast tego przechowuje go jako atrybut HttpServletRequest.

 40
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:48

Servlety są zwykłymi klasami Javy i dlatego nie są bezpieczne dla wątków.

Ale to powiedziawszy, klasy Javy są bezpieczne dla wątków, jeśli nie masz zmiennych instancji. Synchronizować muszą się tylko zmienne instancji. (Zmienne instancyjne są zmiennymi zadeklarowanymi w klasie, a nie w jej metodach.

Zmienne zadeklarowane w metodach są bezpieczne dla wątku, ponieważ każdy wątek tworzy własny stos programu, a zmienne funkcji są przydzielane do stosu. Oznacza to, że zmienne w metodach są stworzony dla każdego wątku, dlatego nie ma żadnych problemów z synchronizacją wątków.

Zmienne metody są bezpieczne dla wątków, zmienne klasy nie są.

 14
Author: Linus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 00:00:19

Istnieje pojedyncza instancja servleta na mapowanie servleta; wszystkie właściwości instancji są współdzielone między wszystkimi żądaniami. Dostęp do tych nieruchomości musi brać to pod uwagę.

Struts 2 akcje (nie "Servlet kontrolera", nie są ani servletami, ani kontrolerami)są tworzone na żądanie. Właściwości akcji będą dostępne tylko dla pojedynczego wątku żądania.

 8
Author: Dave Newton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 15:00:26

Serwlety są zwykle wielowątkowe.

Kontenery serwletów Zwykle zarządzają współbieżnymi żądaniami, tworząc nowy wątek Javy dla każdego żądania. Nowy wątek otrzymuje odniesienie obiektu do żądanego serwletu, który wysyła odpowiedź za pośrednictwem tego samego wątku. Dlatego ważne jest, aby projektować współbieżność podczas pisania servletu, ponieważ wiele żądań może być obsługiwanych przez tę samą instancję servletu.

Sposób, w jaki kontenery servletów obsługują żądania servletów jest zależny od implementacji; mogą używać pojedynczego servleta, mogą używać Servlet poolingu, zależy to od architektury systemu dostawcy.

Struts 2 Obiekty akcji są tworzone dla każdego żądania, więc nie ma problemów z bezpieczeństwem wątku.

 1
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 17:07:58

Servlet nie jest bezpieczny dla wątku, ale możemy uczynić go bezpiecznym dla wątku implementując tę klasę do SingleThreadModel podobnie jak podana poniżej definicja klasy, ale znowu problem z wydajnością będzie tam, więc lepszą opcją byłoby użycie synchronized partion

public class SurveyServlet extends HttpServlet
                           implements SingleThreadModel
{
servlet code here..
...
}
 1
Author: user2663609,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-24 11:46:17

Servlet sam w sobie nie jest bezpieczny dla wątków. Możesz uczynić go bezpiecznym dla wątku, synchronizując metodę usługi. musisz zaimplementować SingleThreadInterface, aby był bezpieczny dla wątku.

 0
Author: lolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 14:58:31