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 🙂
The mistake you are making is here:
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.