Вам не нужно блокировать, поскольку session.setAttribute()
является поточно-ориентированным (см. Комментарий к спецификации сервлета из @McDowell выше).
Однако, давайте использовать другой пример. Допустим, вы хотите проверить значение атрибута, а затем обновить его, если <= 100. В этом случае вам необходимо синхронизировать блок кода для <code>getAttribute(), сравнения <= 100 и <code>setAttribute().
Теперь, что вы должны использовать для блокировки? Помните, что нет синхронизации, если для блокировки используются разные объекты. Таким образом, разные блоки кода должны использовать один и тот же объект. Ваш выбор объекта session
может быть просто удачным. Помните также, что различные блоки кода могут получить доступ к сеансу (как чтение / запись), даже если вы взяли блокировку, если только этот другой код также не блокируется на объекте сеанса. Подводный камень в том, что слишком много мест в вашем коде блокируют объект сеанса и, следовательно, должны ждать. Например, если ваш блок кода использует атрибут сеанса A, а другой кусок кода использует атрибут сеанса B, было бы хорошо, если бы им не нужно было ждать друг друга, взяв блокировку на объекте сеанса. Использование статических объектов с именами LockForA и LockForB может быть лучшим выбором для вашего кода, например. synchronized (LockForA) { }.