Синхронизация в Java-сервлете

По умолчанию все клиенты обращаются к одному созданному объекту сервлета.

Каждое обращение клиента к этому объекту создает отдельный поток, в котором обрабатываться запрос клиента используя этот объект.

Поэтому необходимо заботиться о потокобезопасности.

Чтобы для каждого запроса клиента создавался отдельный объект, а не производилась работа с одним в отдельных потоках можно наследовать SingleThreadModel, но это не рекомендуется, SingleThreadModel объявлен устаревшим (deprecated) вместо этого лучше использовать стандартные средства синхронизации изученные в прошлых уроках о многопоточности.

Пример программы:

import java.util.*; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.annotation.*; @WebServlet(“/SynchroServlet”) //Можно было бы //ниже дописать implements SingleThreadModel { //тогда бы при каждом обращении клиента к этому //сервлету создавался бы отдельный объект MyServlet. //Но мы не будем дописывать. Он deprecated. public class MyServlet extends HttpServlet{ int j = 0; protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //Если придет запрос к этому сервлету одновременно //от 100 клиентов то создастся 100 потоков //и в каждом из них параллельно //будет выполняться код doGet synchronized(this){ for(int i=0;i<5000000;i++){ //и в таком случае если бы цикл //не был обернут в synchronized то //при одновременном обращении //к сервлету от множества клиентов //содержимое переменной j в итоге //не будет корректным. j++; } } PrintWriter pw = resp.getWriter(); pw.print(j); } }

Что такое Filter в Java сервлетах

Фильтры (Filter) в Java сервлетах: выполняйте код до и после обработки запроса. Пример реализации интерфейса Filter для предварительной авторизации и логирования.
Time to read: 14

Слушатели (Listeners) в Java сервлетах

Разберитесь с Listeners в Java сервлетах: отслеживайте изменения атрибутов, сессий и контекста. Практический пример использования ServletContextAttributeListener.
Time to read: 15

Оптимизация сервлетов с AsyncContext

Используйте AsyncContext в Java сервлетах для асинхронной обработки задач. Узнайте, как избежать простоя потоков и повысить производительность веб-приложений с примерами кода.
Time to read: 11