При использовании потоков Java нужно заботиться об основных проблемах, которые идут с параллелизмом посредством синхронизации и т.д.
Tomcat AFAIK также работает с потоками для обработки его рабочей нагрузки. Почему это, что я не должен думать о создании моего кода, ориентированного на многопотоковое исполнение, когда это работает в Tomcat?
Вы действительно должны сделать свой код потокобезопасным в Tomcat. Tomcat будет вызывать ваш код (то есть ваши сервлеты) из нескольких потоков, и если этот код не является потокобезопасным, у вас возникнут проблемы.
Обсуждения Tomcat ничем не отличаются от любых тем, которые вы создаете сами.
Если вы считаете, что Tomcat делает ваше приложение потокобезопасным, напишите сервлет с изменяемыми переменными-членами, например, неконкурентным hashmap.
Затем пусть сервлет помещает вещи в эту hashmap для каждого запроса. Это не займет много времени, чтобы получить прекрасное исключение параллелизма.
Вот почему в общем случае для компонентов типа singleton нужно быть очень осторожным с переменными-членами, потому что они разделяются между несколькими потоками, обращающимися к объекту.
Теперь контейнер сервлетов создает новый переходный объект для каждого запроса (что делают некоторые фреймворки веб-приложений), и вы могли бы поместить поведение, взаимодействующее с переменными-членами, в этот переходный объект и быть потокобезопасным.
Поскольку контейнеры Java EE написаны таким образом, что они обрабатывают потоки за вас. Вы пишете код так, чтобы он был безопасным для потоков, а контейнер делает все остальное. Он объединяет потоки и назначает их по одному на каждый запрос по мере их поступления.
В дополнение к тому, что сказал скаффман, может показаться, что вам не нужно думать о многопоточности при написании веб-приложения, потому что фреймворк сервлетов / API полностью ориентирован на реализацию методов ( service ()
, doGet ()
, doPost ()
и т. Д.), Которые вызываются один раз за HTTP-запрос.
Следовательно, в простом приложении вы можете реализовать эти методы в своем сервлете и / или JSP или чем-то еще и не думать о том, что происходит при взаимодействии нескольких потоков.
Но как только вы начинаете иметь общее состояние между сервлетами или методами службы, то, возможно, не осознавая этого , вы имеете дело с несколькими взаимодействующими потоками, и если вы не будете осторожны, у вас в конечном итоге будет много- проблемы с потоками или синхронизацией. Вам придется иметь дело с этим, потому что в Tomcat (и я предполагаю, что все контейнеры сервлетов, хотя я не знаю, требуется ли это спецификацией сервлетов) каждый запрос обрабатывается (возможно) другим потоком. Поэтому, если вы получаете два одновременных запроса, они будут обрабатываться двумя отдельными потоками одновременно (одновременно).