Потоки Tomcat против потоков Java
При использовании потоков java необходимо позаботиться об основных проблемах, связанных с concurrency с помощью синхронизации и т.д.
AFAIK Tomcat также работает с потоками для обработки своей рабочей нагрузки. Почему это, что мне не нужно думать о том, чтобы сделать мой код потокобезопасным, когда он запущен в Tomcat?
Ответы
Ответ 1
Вам нужно сделать безопасный код в tomcat. Tomcat будет вызывать ваш код (т.е. Ваши сервлеты) из нескольких потоков, и если этот код не является потокобезопасным, у вас будут проблемы.
Потоки Tomcat ничем не отличаются от тех потоков, которые вы создаете сами.
Ответ 2
Чтобы добавить к тому, что упоминал скаффман, может показаться, что вам не нужно думать о многопоточности при написании webapp, потому что структура /API сервлета полностью ориентирована на методы реализации (service()
, doGet()
, doPost()
и т.д.), которые вызывается один раз для HTTP-запроса.
Поэтому в простом приложении вы можете реализовать эти методы в своем сервлете и/или JSP или что-то еще и не думать о том, что происходит при взаимодействии нескольких потоков.
Но во-вторых, вы начинаете иметь разделяемое состояние между сервлетами или сервисными методами, то, не понимая при этом , вы взаимодействуете с несколькими потоками, и если вы не будете осторожны, - проблемы или проблемы синхронизации. Вам придется иметь дело с этим, потому что в Tomcat (и я предполагаю, что все контейнеры сервлетов, хотя я не знаю, требуется ли это по спецификации Servlet), каждый запрос обрабатывается (возможно) другим потоком. Поэтому, если вы получаете два одновременных запроса, они будут обрабатываться двумя отдельными потоками одновременно (в то же время).
Ответ 3
Если вы считаете, что Tomcat делает ваш поток приложений безопасным, напишите Servlet с изменяемыми переменными-членами, такими как неконкурентный хэш файл.
Затем сервлет помещает вещи в эту хэш-карту для каждого запроса. Это не займет много времени, чтобы получить прекрасное исключение concurrency.
Вот почему в целом для одноэлементных компонентов вы должны быть очень осторожны с переменными-членами, поскольку они распределяются между несколькими потоками, обращаясь к объекту.
Теперь контейнер сервлета создает новый переходный объект для каждого запроса (именно это делают некоторые веб-приложения), вы можете поместить поведение, которое взаимодействует с переменными-членами в этом переходном объекте и быть потокобезопасным.
Ответ 4
Поскольку контейнеры Java EE написаны таким образом, что они обрабатывают потоки для вас. Вы пишете свой код, чтобы быть потокобезопасным, а контейнер делает все остальное. Он объединяет потоки и присваивает их по одному на запрос, когда они входят.