Почему (javax.servlet.) SingleThreadModel устарела? - PullRequest
25 голосов

Ответы [ 5 ]

29 голосов
/ 31 марта 2010

Javadoc говорит, почему. SingleThreadModel был разработан, чтобы быть простым решением для параллельной работы с низкой нагрузкой, но ему даже не удалось:

Обратите внимание, что SingleThreadModel не решить все вопросы безопасности потока. За пример, атрибуты сеанса и статика переменные все еще могут быть доступны несколько запросов на несколько потоков в то же время, даже когда SingleThreadModel сервлеты используются. Рекомендуется, чтобы разработчик принять другие средства, чтобы решить эти проблемы вместо реализации этого интерфейс, например, избегая использования переменной экземпляра или синхронизировать блок кода доступ к этим ресурсам.

Если он не может достичь того, для чего он предназначен, его не следует использовать.

11 голосов
/ 31 марта 2010

Это в основном плохой способ обработки параллелизма. Вместо этого удалите состояние из вашего сервлета, чтобы один и тот же сервлет мог использоваться несколькими потоками одновременно. Сохранение состояния в «пуле» экземпляров сервлета, каждый из которых может иметь состояние, оставшееся от предыдущего запроса и т. Д., Довольно ужасно.

4 голосов
/ 03 декабря 2013

Да Интерфейс SingleThreadModel устарел.Не используйте его. На самом деле он вам не нужен, вместо этого используйте локальные переменные вместо полей объекта, поскольку «каждый поток получает свою собственную копию локальных переменных в Java. Просто удалив поле объекта и заменив его налокальная переменная, эта конкретная проблема с потоками решена. " Ссылка

1 голос
/ 30 декабря 2012

Из Java Servlet Spec:

Использование интерфейса SingleThreadModel гарантирует, что только один поток будет одновременно выполняться в службе данного экземпляра сервлета метод. Важно отметить, что эта гарантия распространяется только на каждый экземпляр сервлета, так как контейнер может выбрать такой пул объекты. Объекты, которые доступны более чем одному экземпляру сервлета время, например, экземпляры HttpSession, могут быть доступны в любом определенное время для нескольких сервлетов, включая те, которые реализуют SingleThreadModel.
Рекомендуется, чтобы разработчик использовал другие способы решения этих проблем вместо реализации этого интерфейса, такие как использование переменной экземпляра или синхронизации блока код доступа к этим ресурсам. Интерфейс SingleThreadModel не рекомендуется в этой версии спецификации.

0 голосов
/ 17 июля 2018

Если сервлет реализует интерфейс SingleThreadModel, контейнер сервлета может создать один или несколько экземпляров сервлета в зависимости от загрузки запроса. Каждый экземпляр будет использовать только свой метод service(). Это решает проблемы безопасности потоков, но не все из них. Такие как статические переменные класса, атрибуты сеанса все еще не являются потокобезопасными.

Вместо использования этого интерфейса разработчик рекомендует использовать синхронизирующий блок кода, обращающийся к этим ресурсам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...