Tomcat распараллеливает по сравнению с потоками Java

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

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

16
задан black666 11 May 2010 в 11:00
поделиться

4 ответа

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

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

36
ответ дан 30 November 2019 в 15:16
поделиться

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

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

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

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

4
ответ дан 30 November 2019 в 15:16
поделиться

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

1
ответ дан 30 November 2019 в 15:16
поделиться

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

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

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

22
ответ дан 30 November 2019 в 15:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: