Why instance variable in Servlet is not thread-safe

instance-variables, jakarta-ee, java, servlets, thread-safety

Solution

The mistake you are making is here:

So, because all these threads create a new class instance for ActionServlet, so I don't see any problem here. because instances of these thread is separate of each other.

The container does not create a new instance of the Servlet class for each request. It reuses an existing one. This is why they are not thread safe.

The Stripes Action Framework DOES create a new instance for each request, so that's an okay assumption under that framework. However, for example, Struts 1 follows the Servlet model and does not create a new action per request.

That does not mean that the container is limited to a single instance, it in theory can create more than one, but it's not a specified behavior so can not be relied upon. Most of the popular ones do not.

Problem

When I read `Head First Servlet and JSP`, they say that instance variable is non-thread safe. I don't understand this statement so much. For example: I have a servlet which name is `ActionServlet.java`. Each time, each user's request is sent to server, container will create a new thread and create new `ActionServlet` instance. `ActionServlet` may be has a structure: ``` public class ActionServlet extends HttpServlet { // example of instance variable Instance variable; public void processRequest(HttpServletRequest request, HttpServletResponse response) { // process something relating to instance variable } } ``` So, because all these threads create a new class instance for `ActionServlet`, so I don't see any problem here. because instances of these thread is separate of each other. Please figure out where problem when use instance variable in multithread environment. Thanks :)

Original source

Related problems