Топ-100Синхронизация в Java сервлете - CodOrbits
LogoCodOrbits

Раздел: Servlets

Познакомьтесь с сервлетами Java: создание динамических веб-страниц и работа с HTTP-запросами и ответами.

Все разделы
Иконка Servlets

Синхронизация в 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
мин.

Similar Articles Icon
Divider

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

15
мин.

Similar Articles Icon
Divider

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

11
мин.

Similar Articles Icon