Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Сервлеты и многопоточность

Вопрос по данному коду :
1.Насколько я знаю Servlet Container отвечает за потокобезопасность сервлетов.
2.Но сушествует вариант что несмотря на это может возникнуть проблема с потокобезопасностью как например в данном коде.
Мой вопрос заключается в том: почему при данном коде переменная counter считается не потокобезопасной ?
package threadSafety; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; import java.math.*; public class SimpleServlet extends HttpServlet { //A variable that is NOT thread-safe! private int counter = 0; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().println(""); resp.getWriter().println(this + ":
"); for (int c = 0; c < 10; c++) { resp.getWriter().println("Counter = " + counter + "
"); try { Thread.currentThread().sleep((long) Math.random() * 1000); counter++; } catch (InterruptedException exc) { } } resp.getWriter().println(""); } }


Ответ

Создание собственных потоков в контейнере сервлетов - не очень хорошая практика. Если есть возможность, то лучше перейти к асинхронной обработки запросов
В противном случае, вы сами обязаны отвечать за потокобезопасность, отключение и вообще весь контроль за вашими потоками.
Отвечая на ваши вопросы:
1.Насколько я знаю Servlet Container отвечает за потокобезопасность сервлетов.
Для порожденных вами потоков - нет.
2.Но сушествует вариант что несмотря на это может возникнуть проблема с потокобезопасностью как например в данном коде.
Так как переменная у вас уровня экземпляра, а контейнер создает на каждый сервлет только один экземпляр его класса(https://java.net/downloads/servlet-spec/Final/servlet-3_1-final.pdf - глава 2, параграф 2.2), то и эта переменная будет общая для всех запросов и соответственно модифицировать ее могут несколько запросов одновременно.

Комментариев нет:

Отправить комментарий