Threadlocal связан с потоком / процессом, а не с сеансом. JVM на самом деле не знает и не заботится о концепции веб-сессий, это более высокий уровень абстракции.
Вполне возможно, что два веб-запроса с двумя сеансами обрабатываются одним потоком. Большинство серверов используют пул потоков, которые они используют повторно, а не создают новый поток для каждого запроса или даже сеанса. Если обработка первого запроса оставляет что-то в локальном потоке после того, как он завершит обработку запроса, то вот что найдет следующий запрос.
Храните данные, необходимые для каждой сессии, в HttpServletRequest.getSession () .