File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes Servlets and the fly likes how are local variables in doPost() thread safe? Big Moose Saloon
  Search | Java FAQ | Recent Topics
Register / Login
JavaRanch » Java Forums » Java » Servlets
Reply Bookmark "how are local variables in doPost() thread safe?" Watch "how are local variables in doPost() thread safe?" New topic
Author

how are local variables in doPost() thread safe?

sven studde
Ranch Hand

Joined: Sep 26, 2006
Posts: 148
Suppose you have the following code in doPost():



Obviously, the user agent can be different for a different client request. So how can you count on the output being correct? Couldn't another client make another request which starts another thread, and then couldn't the second thread set the output to something else before the output in the first thread can be displayed?
Bear Bibeault
Author and ninkuma
Marshal

Joined: Jan 10, 2002
Posts: 56157
    
  13

Each request, running in its own thread, gets its own HttpServletRequest and HttpServletResponse instances and output buffer. You don't need to worry about them overlapping.


[Smart Questions] [JSP FAQ] [Books by Bear] [Bear's FrontMan] [About Bear]
sven studde
Ranch Hand

Joined: Sep 26, 2006
Posts: 148
Originally posted by Bear Bibeault:
Each request, running in its own thread, gets its own HttpServletRequest and HttpServletResponse instances and output buffer. You don't need to worry about them overlapping.


Yes, I knew that part. Let me see if this is a better example of what is confusing me:

int x = 20;
x = 10;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<div>" + x + "</div>");


How do you know a 2nd thread won't be assigning 20 to x, just before this thread adds the value of x to the response? I don't see how setting x = 10 is isolated inside one particular request; it's inside the servlet's doPost() method, which all the threads access.
[ October 10, 2006: Message edited by: sven studde ]
Ben Souther
Sheriff

Joined: Dec 11, 2004
Posts: 13410

There will be one copy of x for each request.

In contrast, an instance variable would not be thread safe becuase all requests will use the same one:

Local variable (thread safe):


Instance variable (not thread safe):


Java API J2EE API Servlet Spec JSP Spec How to ask a question... Simple Servlet Examples jsonf
Bear Bibeault
Author and ninkuma
Marshal

Joined: Jan 10, 2002
Posts: 56157
    
  13

To add to Ben's excellent post, that's the way Java threading works. Variables that are local to a method are allocated on a per-thread basis. You never have to worry abouth thread-safety with variables declared inside a method.
sven studde
Ranch Hand

Joined: Sep 26, 2006
Posts: 148
Well, I was hoping to be enlightened with a rule that when applied to instance variables and servlet context attributes resulted in them being not thread safe, yet when the rule was applied to local service method variables it resulted in those variables being thread safe. But if the rule is "that's the way it is", then I guess it's just memorization, and there's no logic behind it.
[ October 10, 2006: Message edited by: sven studde ]
Christophe Verré
Sheriff

Joined: Nov 24, 2005
Posts: 14669
    
  11

But if the rule is just "that's the way it is", then I guess it's just memorization.

I don't understand what you have to memorize here. A bit of logic will do. As Bear said, that's how threading works.


[My Blog]
All roads lead to JavaRanch
Bear Bibeault
Author and ninkuma
Marshal

Joined: Jan 10, 2002
Posts: 56157
    
  13

... yet when the rule was applied to local service method variables it resulted in those variables being thread safe


How much more detailed of a rule than "Variables that are local to a method are allocated on a per-thread basis" do you need?
[ October 10, 2006: Message edited by: Bear Bibeault ]
 
I agree. Here's the link: http://ej-technologies/jprofiler - if it wasn't for jprofiler, we would need to run our stuff on 16 servers instead of 3.
 
subject: how are local variables in doPost() thread safe?
 
Similar Threads
how to get browser name in a icefaces
Thread in a Servlet
Ajaxstart/Ajaxstop Global Handler Form Reference
javascript help on popups: how to use different messages on the same function?
Can a servlet architecture download a file?