![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| unkis |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 802 Регистрация: 8.9.2004 Репутация: нет Всего: 1 |
Ребята есть GWT приложение, в етом преложении реализованно следующее.
и дальше в коде можно встретить следующее:
Как такое может работать? если статическое поле "session" для всех пользователей должно быть одинаковое или я что-то не понимаю? -------------------- www.unkis.com |
||||
|
|||||
| emmanuil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: нет Всего: 3 |
Потому что инициализируешь поле session для каждого запроса. Посмотри ЖЦ сервлетов. И получается, что толку нету, что это поле статическое.
И если нужно иметь HttpSession чтобы все работало, то обновляй там в методе не поле session, а поле класса AAPSession, которое хранит HttpSession. Это сообщение отредактировал(а) emmanuil - 21.1.2011, 20:24 |
|||
|
||||
| SoulSeeker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 21.7.2008 Репутация: 2 Всего: 2 |
||||
|
||||
| emmanuil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: нет Всего: 3 |
А так. Если нужно статическое поле sesion и чтобы она хранила одни данные для всех и при этом продолжало всё работать (из указанного примера), то нужно обновлять поле класса AAPSession, а не каждый раз создавать экземпляр. Смотрю по тому, что дано. Не знаю, что там в самом классе реализовано. Статика тут только для удобства получения данных текущего запроса и кроме этого толку в ней нет, так как при следующем запросе, все обновится и ничего разделяемого не будет. Можно сделать в классе AAPSession поле currentRequest, например, и его обновлять в сервлете.
Во первых, сессия у каждого своя. Во вторых, если она при каждом запросе обновляется, откуда она будет одна разделяемая для всех клиентов? Поле session обновится данными клиента отправившего запрос. И так будет при каждом запросе. Как это работает, я уже описал. Возможно, сервлет слушает все запросы и поэтому проблем не возникает. Если это все работает, то неопасно, может кто-то другой считает иначе. Просто нужно помнить про статическое поле. |
|||
|
||||
| SoulSeeker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 21.7.2008 Репутация: 2 Всего: 2 |
emmanuil, при двух и более параллельных запросах статическое поле session никак не будет разным у всех потоков. Поэтому, отвечая на вопрос
да, опасно. Потому что на поле session не стоит синхронизация. Допустим, один поток инициализирует, другой тут же меняет session на свое значение, потому что запрос пришел на доли секунды позже. Это сообщение отредактировал(а) SoulSeeker - 26.1.2011, 21:39 |
|||
|
||||
| emmanuil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: нет Всего: 3 |
Это да. И я не просто так написал, что помнить нужно про статическое поле. Если есть интенсивная работа клиентов, то блокировка в методе service может привести к задержкам. Скорее нужно пересмотреть определение текущего пользователя. |
|||
|
||||
| SoulSeeker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 21.7.2008 Репутация: 2 Всего: 2 |
Короче говоря, данный код неверен с точки зрения доступа к разделяемому ресурсу. Решение - убрать модификатор static с поля session и не париться по поводу левого изменения от разных потоков. Такие ошибки очень трудно выявляются впоследствии и их появление трудно воспроизвести.
|
|||
|
||||
| _sten_ |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 184 Регистрация: 29.9.2006 Репутация: 3 Всего: 3 |
можно использовать ThreadLocal тогда проблем с конкурентным изменением не будут, но вопрос наснолько это коректно использовать с точки зрения дизайна остаеться открытым(ThreadLocal привязывает обьект к текущему токотку, и если создатасть новые потоки то будут проблемы), но как квикфикс пойдет точно.
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' ! |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |