Мне нужно знать, почему сервлеты не являются потокобезопасными? И в чем причина того, что в сервлете контроллера Framework Struts 2.0 потокобезопасен?
Почему сервлеты не являются потоками?
Ответ 1
Мне нужно знать, почему сервлеты не являются потокобезопасными?
Экземпляры сервлета по своей сути не являются потокобезопасными из-за многопоточного характера языка программирования Java в целом. Виртуальная машина Java поддерживает выполнение одного и того же кода несколькими потоками. Это отличное преимущество в производительности на машинах с несколькими процессорами. Это также позволяет выполнять один и тот же код несколькими одновременными пользователями, не блокируя друг друга.
Представьте себе сервер с 4 процессорами, в котором нормальный сервлет может обрабатывать 1000 запросов в секунду. Если этот сервлет был потокобезопасным, веб-приложение будет действовать так, как если бы оно выполнялось на сервере с 1 процессором, в котором сервлет может обрабатывать только 250 запросов в секунду (хорошо, это не совсем так, но вы получили идею).
Если вы сталкиваетесь с проблемами безопасности потоков при использовании сервлетов, то это ваша ошибка, а не ошибка Java или сервлета. Вам нужно будет исправить код сервлета так, чтобы данные запроса или сеанса не были назначены в качестве переменной экземпляра сервлета. Подробное объяснение см. Также Как работают сервлеты? Создание, сеансы, общие переменные и многопоточность.
И в чем причина того, что в сервлете контроллера Framework Struts 2.0 потокобезопасен?
Он не является потокобезопасным. Вы сбиваете с толку фильтр Struts dispatchcher сервлета с помощью действий Struts. Действия расположений воссоздаются по каждому отдельному запросу. Таким образом, у каждого отдельного запроса есть свой экземпляр действия Struts, охваченного запросом. Фильтр сервлетов сервлетов Struts не сохраняет их как свою собственную переменную экземпляра. Вместо этого он сохраняет его как атрибут HttpServletRequest
.
Ответ 2
Сервлеты являются нормальными классами Java и, следовательно, не являются потоковыми.
Но это говорит о том, что классы Java являются потокобезопасными, если у вас нет переменных экземпляра. Необходимо синхронизировать только переменные экземпляра. (Переменная экземпляра - это переменные, объявленные в классе, а не внутри своих методов.
Переменные, объявленные в методах, являются потокобезопасными, поскольку каждый поток создает его собственный стек программы, а функциональные переменные выделяются в стеке. Это означает, что переменная в методах создается для каждого потока, следовательно, нет связанных с ней проблем синхронизации.
Переменные метода являются потокобезопасными, переменные класса - нет.
Ответ 3
Существует один экземпляр сервлета для отображения сервлета; все свойства экземпляра разделяются между всеми запросами. Доступ к этим свойствам должен быть включен в аккаунт.
Действия Struts 2 (а не "сервлет контроллера", они не являются сервлетами или контроллерами) создаются для каждого запроса. Свойства действия будут доступны только по одному потоку запроса.
Ответ 4
Сервлеты обычно многопоточные.
Контейнеры сервлета обычно управляют параллельными запросами, создавая новый поток Java для каждого запроса. Новый поток получает ссылку на объект для запрошенного сервлета, который выдает ответ через тот же поток. Вот почему при написании сервлета важно создать конструкцию для concurrency, потому что несколько запросов могут обрабатываться одним и тем же экземпляром сервлета.
Способ, которым контейнеры сервлетов обрабатывают запросы сервлета, зависит от реализации; они могут использовать один сервлет, они могут использовать объединение сервлетов, это зависит от архитектуры системы поставщика.
Struts 2 Объекты Action создаются для каждого запроса, поэтому нет проблем с потоковой безопасностью.
Ответ 5
Сервлет не является потокобезопасным, но мы можем сделать его безопасным потоком, выполнив этот класс сервлета до SingleThreadModel
как приведенное ниже определение класса, но опять же проблема производительности будет там, поэтому лучшим вариантом будет использование синхронизированной части
public class SurveyServlet extends HttpServlet
implements SingleThreadModel
{
servlet code here..
...
}
Ответ 6
Серблет сам по себе не является потокобезопасным. Вы можете сделать его потокобезопасным, выполнив синхронизацию метода службы. вам необходимо реализовать SingleThreadInterface, чтобы сделать его потокобезопасным.