Any variable stored in ThreadLocal are per thread as we knew, but most people does know that even the thread has been expeired or dead, it's copy of the variable in ThreadLocal won't disappear.
I read the STRUTS 2 code recently, figured out that you should always manually cleanup the variables in ThreadLocal when your thread is about to close.
In below code, ThreadLocal variables in dispatcher and ActionContext will be cleaned up:
public void destroy() {
if (dispatcher == null) {
log.warn("something is seriously wrong, Dispatcher is not initialized (null) ");
} else {
try {
dispatcher.cleanup();
} finally {
ActionContext.setContext(null);
}
}
}
Just write this done in case forgot in future.