Я подведу итог тому, что было сказано в комментариях к ответу Мэтта Болла, так как в конце оно получилось довольно длинным, а сообщение потеряно: и сообщение было
в общей среде.Как и веб-сервер / сервер приложений, вы должны очень стараться найти решение без синхронизации.Использование статических помощников, синхронизированных со статическим объектом, может работать достаточно хорошо для автономного приложения с одним пользователем перед экраном, в многопользовательском / многопользовательском сценарии это, скорее всего, приведет к очень низкой производительности - это фактически означает сериализацию доступа кВаше приложение, все пользователи должны будут ждать на одной и той же блокировки.Вы можете не заметить проблему в течение длительного времени: если вычисления выполняются достаточно быстро и нагрузка распределяется равномерно.
Но вдруг все ваши пользователи могут попытаться выполнить вычисления в 9:00, и ваше приложениеперестану работать!Я имею в виду, что на самом деле не останавливаться, но все они блокировали бы блокировку и создавали огромную очередь.
Теперь, независимо от необходимости общего состояния, так как вы изначально назвали вычисления субъектом синхронизации: нужно ли их результатыбыть общим?Или эти расчеты специфичны для пользователя / сеанса?В последнем случае будет достаточно ThreadLocal в соответствии с Peter Lawrey.В противном случае я бы сказал, что для общей производительности было бы лучше дублировать вычисления для всех, кто в них нуждается, чтобы не синхронизировать (зависит от стоимости).
Управление сессиями также лучше оставить в контейнере: онобыл оптимизирован для их эффективной обработки, при необходимости, включая кластеризацию и т. д. Я сомневаюсь, что можно было бы найти лучшее решение, не вкладывая много работы и не делая много ошибок на пути туда.Но, как заявил Мэтт Болл, его лучше спросить отдельно.