Thanks for that great answer! I'm hoping you could help clarify my
understanding and answer some more questions that your response brought
up...

Based on the behavior you specified of ThreadLocals sticking around after
the webapp is undeployed, is it correct to say that the thread pool you
mentioned is global to ALL webapps in Tomcat, rather than multiple thread
pools, one for each webapp in the same Tomcat instance?

Is it also correct to say that this could be a security problem, where a
user in another webapp could inadvertently see something left around in a
ThreadLocal from another user in the same webapp - or from another user in a
different webapp?

Do you see any problems with creating one or more ThreadLocals as the first
operation in the first filter defined for a webapp, and closing them (i.e.
nulling them out) as the last operation in that same filter? This would
thereby ensure that the ThreadLocal is there for the entire scope of the
request. Do the garbage collection problems you mentioned apply in this
case?

(This next question is more to see whether my thought process is correct
rather than to bash the servlet spec or Tomcat.) I can understand how any
context listener methods aren't guaranteed to be called in the same thread
as a request, because it's a completely unrelated concept. But am I correct
to say that it's a limitation that session listeners (both attribute-binding
and creational listener methods) aren't guaranteed to be run in the same
thread as the request that created it? 

After all, each of those operations happens directly because of and "in" a
given request, so wouldn't it be a better design for those methods to be
called by the same thread? That way, you could use ThreadLocals to obtain
values in the session listeners that are inserted elsewhere in the same
request that created/invalidated a session, or bound/unbound a session
attribute.




Caldarale, Charles R wrote:
> 
>> From: lightbulb432 [mailto:[EMAIL PROTECTED] 
>> Subject: Re: Is ThreadLocal safe to use in servlets
>> 
>> A different way of asking this question is where/when
>> does Tomcat start the Thread that handles a given
>> request, and what is executed in the context of that
>> thread? (e.g. filters, listeners, other things, servlets 
>> of course)
> 
> Tomcat utilizes a thread pool for processing requests; the same thread
> is used for the duration of the request through the entire
> filter/servlet chain (required by the servlet spec), including data base
> and other external resource access.  However, since the threads are
> pooled, you can't count on ever seeing the same thread twice in a given
> servlet, so ThreadLocal objects are best created and destroyed during
> individual request handling; trying to keep them around longer runs the
> risk of their continuing to exist even after a webapp has been stopped
> or undeployed, resulting in garbage collection problems.
> 
> Since Listeners are not associated with a specific request, there's no
> guarantee that the thread running through any Listener code will ever be
> used for a request for the associated webapp, and there's no guarantee
> it won't.
> 
>  - Chuck
> 
> 
> THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY
> MATERIAL and is thus for use only by the intended recipient. If you
> received this in error, please contact the sender and delete the e-mail
> and its attachments from all computers.
> 
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Is-ThreadLocal-safe-to-use-in-servlets-tf3858168.html#a11270259
Sent from the Tomcat - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to