Reputation: 25
if there is a synchronized
block in the service()
method of say for example in ActionServlet
of struts, how will multiple requests/threads work if it is a busy site having large number of hits.
Will each thread wait for the next other one to release lock from the synchronized block? Will that create delay in response
Upvotes: 1
Views: 1659
Reputation:
Don't synchronize the service method of a servlet.
If you synchronize the service
method of a servlet, you are in fact making a "reservation on access" for a thread at a time for that instance of the Servlet.
The Struts ActionServlet
class is a HttpServlet
and basically the doGet
and doPost
methods are of interest here. If we are to speak about Struts, the process method is the main entry point, but the same principle applies to all methods as it does for the general service
method.
The idea is this.
When you declare a servlet in your web.app
, the servlet container (e.g. Tomcat) will create only one instance of that servlet. This means there is only one instance to serve all requests.
If more requests arrive at the same time, each request thread gets it chance at the service
method because there is no synchronization enforced.
If you have 10 request threads, each will execute concurrently in the service
method. This is normally safe because processing done in the service
method does not involve any state related to the current request it is handling. You go into issues if you add state to your servlets. Here is an article with more details on the subject.
Now back to Struts.
Struts uses a pattern called a Front Controller with the ActionServlet
being that controller. This will in turn delegate specific requests to specific Action
classes as specified in its configuration (a.k.a struts-config.xml
).
All incoming request pass though here. If you place synchronization at this point (the Struts process
method or the servlet service
method higher up) you are reserving the servlet for a thread at a time. In case of struts, you are reserving all processing of a request to a single thread at a time.
That means that if 10 request arrive simultaneousely, in the case without synchronization all can execute side by side, while in the case with synchronization request 2 will have to wait until request 1 is done, 3 waits for 2 and so on (i.e. requests are sequentially processed). And this means poor performance.
Maybe for the lucky user that made request 1 there will be no performance impact but number 10 will have to wait. Then how about number 100? 200?
There is no need to synchronize the entry point if you program your application with thread safety in mind. If your application is of the sort that you just can't avoid synchronization, then synchronizing the entry point will reduce performance.
P.S. Just one other thing. If you are thinking into moving the synchronization lower in the process, namely the Action
classes, note that they are not thread safe either and there is only one instance of it inside the Struts framework.
Upvotes: 5