Я подозреваю, что вопрос еще: могу ли я использовать объекты ThreadLocal для передачи данных между фильтрами и сервлетами? В этом случае ответ, безусловно. Серверы приложений делают это сами для отслеживания безопасности, транзакций, подключений и другой информации запроса.
Просто убедитесь, что вы очищаете свой ThreadLocal в блоке finally в том же коде, который устанавливает ThreadLocal.
Как уже отмечалось другими, сами сервлеты могут или не могут быть синхронизированы, но это ортогонально концепции состояния потока; то есть сколько потоков выполняется против объекта foo, и могу ли я поместить состояние в поток и видеть его объектом foo. Ответ на второй вопрос всегда да.
Единственный раз, когда ответом будет «нет», это если вы используете какую-либо асинхронную связь:
- Отправил вызов через AsyncContext
- смешался в EJB и начал использовать @Asynchronous или TimerService
Они включают в себя запуск сервером приложений новых потоков, не связанных с исходным потоком запросов, поэтому любое состояние ThreadLocal не будет перемещаться с новым потоком. Именно поэтому эти API-интерфейсы не позволяют распространять контекст безопасности и транзакции вызывающей стороны на вызываемый метод, так как вызывающая сторона и метод находятся в разных потоках.
Расширенное примечание: InheritableThreadLocal обычно не работает, поскольку асинхронные вызовы обычно выполняются сервером против пула потоков, а не создают дочерние потоки потока вызывающей стороны.