Hi all,
I've started to review the use of ThreadLocal within the Tomcat code
base given that using virtual threads will soon be an option.
The first usage I came to raised a few questions. The usage is in
ApplicationContext:
https://github.com/apache/tomcat/blob/main/java/org/apache/catalina/core/ApplicationContext.java#L418
My first question - mostly for Rémy - is can you remember why this is a
ThreadLocal. I admit that is a bit of an ask since the use of
ThreadLocal dates back almost 20 years to this commit:
https://svn.apache.org/viewvc/tomcat/archive/tc5.5.x/trunk/container/catalina/src/share/org/apache/catalina/core/ApplicationContext.java?r1=301883&r2=301884&
My guess, is that a ThreadLocal was used as a way to cache instances of
MappingData and MessageBytes between requests - recycle and reuse rather
than GC. Is that right?
The second question is what do we want to do about usages such as this.
With virtual threads the end result will be, effectively, a new object
for every request. Do we:
a) Leave the code as-is. It will work as currently with a thread pool
and virtual threads will effectively create new objects for each request.
b) Drop the ThreadLocal and always create new objects.
c) Switch to some other form of caching. My starting point would be
SynchropnizedStack. That may see some contention as it will be global
rather than per thread. Then again, ThreadLocal some overhead too.
Given these optimization decisions were made 20 years ago and JVMs,
especially GC, have moved on since then, I'm leaning towards option b)
with c) as the fall-back if performance issues are discovered.
Thoughts?
Mark
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org