Вопрос по данному коду :
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("
"); 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), то и эта переменная будет общая для всех запросов и соответственно модифицировать ее могут несколько запросов одновременно.
Комментариев нет:
Отправить комментарий