Потоки Tomcat против потоков Java - PullRequest
15 голосов
/ 11 мая 2010

При использовании Java-потоков необходимо позаботиться об основных проблемах, связанных с параллелизмом, через синхронизацию и т. Д.

AFAIK Tomcat также работает с потоками для обработки своей рабочей нагрузки. Почему мне не нужно думать о том, чтобы сделать мой код безопасным для потоков, когда он выполняется в Tomcat?

Ответы [ 4 ]

34 голосов
/ 11 мая 2010

Вы do должны сделать ваш поток кода безопасным в tomcat. Tomcat будет вызывать ваш код (т. Е. Ваши сервлеты) из нескольких потоков, и если этот код не является потокобезопасным, у вас будут проблемы.

Потоки Tomcat ничем не отличаются от тех, которые вы создаете сами.

21 голосов
/ 11 мая 2010

Чтобы добавить к тому, что упомянул skaffman, может показаться, что вам не нужно думать о многопоточности при написании веб-приложения, потому что инфраструктура / API Servlet полностью ориентирована на реализацию методов (service(), doGet(), doPost() и т. Д.), Которые вызываются один раз для каждого HTTP-запроса.

Следовательно, в простом приложении вы можете реализовать эти методы в своем сервлете и / или JSP или в любом другом месте и не думать о том, что происходит, когда взаимодействуют несколько потоков.

Но в тот момент, когда вы начинаете иметь общее состояние между сервлетами или сервисными методами, затем, возможно, не осознавая этого вы работаете с несколькими потоками, взаимодействующими, и если вы не будете осторожны, вы в конечном итоге получите проблемы с потоками или синхронизацией. Вам придется иметь дело с этим, потому что в Tomcat (и я предполагаю, что все контейнеры сервлетов, хотя я не знаю, требуется ли это спецификацией Servlet), каждый запрос обрабатывается (возможно) другим потоком. Поэтому, если вы получите два одновременных запроса, они будут обрабатываться двумя отдельными потоками одновременно (одновременно).

4 голосов
/ 11 мая 2010

Если вы считаете, что Tomcat делает ваше приложение безопасным для потока, напишите сервлет с изменяемыми переменными-членами, такими как непараллельная хэш-карта.

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

Вот почему в целом для одноэлементных компонентов нужно быть очень осторожным с переменными-членами, поскольку они совместно используются несколькими потоками, обращающимися к объекту.

Теперь контейнер сервлета создает новый временный объект для каждого запроса (что и делают некоторые фреймворки веб-приложений). Вы можете задать поведение, взаимодействующее с переменными-членами в этом временном объекте, и быть поточно-ориентированным.

1 голос
/ 11 мая 2010

Поскольку контейнеры Java EE написаны таким образом, что они обрабатывают потоки для вас. Вы пишете свой код, чтобы быть потокобезопасным, а контейнер делает все остальное. Он объединяет потоки и назначает их по одному на каждый запрос.

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