Посты, на которые вы ссылаетесь, сообщают вам, что HTTPSession является общим состоянием, и вы должны быть осторожны, когда несколько потоков могут изменить его.Здесь существует возможность вмешательства потоков, если у вас есть два одновременных запроса POST от одного и того же пользователя, которые вызывают этот метод.Вы можете обработать это чем-то вроде
private void updateSessionHashSet(HttpServletRequest req){
String csv = req.getParameter("theCsv");
Set<String> hs = new HashSet<String>();
String[] arr = csv.split(",");
for(int i = 0; i < arr.length; i++){
hs.add(arr[i].trim());
}
req.getSession().setAttribute("theHashSet", hs);
}
Таким образом, вы сначала собираете новый хэш-набор в локальную переменную, а затем код перезаписывает ссылку на атрибут сеанса theHashSet атомарно.Если два потока вызывают один и тот же код, то один или другой выиграют, но два не будут смешаны вместе (что может случиться с вашим опубликованным кодом).
В качестве альтернативы вам могут понравиться некоторыеиз ответов на связанные посты советуют и синхронизируют объект HttpSession, но поскольку вы синхронизируете объект Java, который является локальным для данного экземпляра приложения, вы должны обратить внимание на случай, когда приложение распределено по несколькимузлы.Синхронизация означает использование общей блокировки, и для всех JVM нет общего доступа.
Обычно ИТ-отделы хотят развернуть приложение в нескольких экземплярах, чтобы избежать единой точки отказа.Вы можете справиться с проблемой синхронизации, прикрепив сеанс к определенному серверу, но это затрудняет балансировку нагрузки.
Кстати, хранение вещей в HttpSession, вероятно, не лучший план, вы должны сохранить этов каком-то хранилище данных.Лучший способ обеспечить безопасный параллелизм - минимизировать количество изменяемого состояния.HttpSession не является чем-то, что можно использовать в качестве долговременного хранилища.
Для рекомендаций по безопасности потоков Java EE у меня есть соответствующий ответ здесь .