Синхронизация в Java сервлете
Last updated: 10 мая 2025 г.По умолчанию все клиенты обращаются к одному созданному объекту сервлета.
Каждое обращение клиента к этому объекту создает отдельный поток, в котором обрабатываться запрос клиента используя этот объект.
Поэтому необходимо заботиться о потокобезопасности.
Чтобы для каждого запроса клиента создавался отдельный объект, а не производилась работа с одним в отдельных потоках можно наследовать SingleThreadModel
, но это не рекомендуется, SingleThreadModel
объявлен устаревшим (deprecated) вместо этого лучше использовать стандартные средства синхронизации изученные в прошлых уроках о многопоточности.
Пример программы:
1import java.util.*;
2import java.io.IOException;
3import java.io.PrintWriter;
4
5import javax.servlet.ServletException;
6import javax.servlet.http.HttpServlet;
7import javax.servlet.http.HttpServletRequest;
8import javax.servlet.http.HttpServletResponse;
9import javax.servlet.http.HttpSession;
10import javax.servlet.annotation.*;
11
12@WebServlet("/SynchroServlet")
13//Можно было бы
14//ниже дописать implements SingleThreadModel {
15//тогда бы при каждом обращении клиента к этому
16//сервлету создавался бы отдельный объект MyServlet.
17//Но мы не будем дописывать. Он deprecated.
18public class MyServlet extends HttpServlet{
19 int j = 0;
20 protected void doGet(HttpServletRequest req,
21 HttpServletResponse resp)
22 throws ServletException, IOException {
23
24 //Если придет запрос к этому сервлету одновременно
25 //от 100 клиентов то создастся 100 потоков
26 //и в каждом из них параллельно
27 //будет выполняться код doGet
28 synchronized(this){
29 for(int i=0;i<5000000;i++){
30 //и в таком случае если бы цикл
31 //не был обернут в synchronized то
32 //при одновременном обращении
33 //к сервлету от множества клиентов
34 //содержимое переменной j в итоге
35 //не будет корректным.
36 j++;
37 }
38 }
39 PrintWriter pw = resp.getWriter();
40 pw.print(j);
41 }
42}
Следующие уроки
Что такое Filter в Java сервлетах
14
мин.
Слушатели (Listeners) в Java сервлетах
15
мин.
Оптимизация сервлетов с AsyncContext
11
мин.