переменные threadlocal в сервлете

В этом случае я получал данные подсчета на моем адаптере, но он должен был получить «размер» адаптера, чем получить «счет». Это сейчас работает на меня. :)

6
задан user2427 26 November 2008 в 20:29
поделиться

4 ответа

Короткий ответ: Да.
Немного дольше один: Это - то, как Spring делает свое волшебство. Посмотрите RequestContextHolder (через DocJar).

Осторожность необходима, хотя - необходимо знать, когда делать недействительным ThreadLocal, как подчиниться другим потокам и как (не) быть запутанными с non-threadlocal контекстом.

Или Вы могли просто использовать Spring...

4
ответ дан 10 December 2019 в 00:46
поделиться

Я думаю, что они глобальны ко всем запросам, выполненным с тем определенным потоком только. Другие потоки получают другие копии локальных данных потока. Это - ключевой пункт локальной памяти потока: http://en.wikipedia.org/wiki/Thread-local_storage#Java.

Если Вы не проверите подходящий вариант в конфигурацию сервлетов, контейнер сервлета будет использовать Ваш сервлет с несколькими потоками для обрабатывания запросов параллельно. Так эффективно у Вас были бы отдельные данные для каждого потока, это служит клиентам.

Если Ваш WebApplication не распределяется (работает на нескольких виртуальных машинах Java), можно использовать ServletContext возразите для хранения совместно используемых данных через запросы и потоки (убедиться сделать надлежащую блокировку затем).

3
ответ дан 10 December 2019 в 00:46
поделиться

Как Adiel говорит, надлежащий способ сделать, это должно, вероятно, использовать контекст запроса (т.е. HttpServletRequest), для не создания ThreadLocal. В то время как, конечно, возможно использовать ThreadLocal здесь, необходимо стараться очистить поток, если Вы сделаете это, то так как иначе следующий запрос, который получает поток, будет видеть значение, связанное с предыдущим запросом. (Когда первый запрос будет сделан с потоком, поток возвратится в пул и таким образом, следующий запрос будет видеть его.) Никакая причина должными быть управлять такой вещью, когда контекст запроса существует для точно этой цели.

2
ответ дан 10 December 2019 в 00:46
поделиться

Переменные Threadlocal всегда определяются, чтобы быть полученными доступ глобально, так как точка должна прозрачно передать информацию вокруг системы, к которой можно получить доступ где угодно. Значение переменной связывается с потоком, на котором это установлено, поэтому даже при том, что переменная глобальна, это может иметь различные значения в зависимости от потока, от которого к этому получают доступ.

Простой пример состоял бы в том, чтобы присвоить пользовательскую строку идентификационных данных потоку в локальной переменной потока, когда запрос получен в сервлете. Где угодно вдоль цепочки обработки того запроса (принимающий это находится на том же потоке в том же VM), идентификационные данные могут быть получены путем доступа к этой глобальной переменной. Также было бы важно удалить это значение, когда запрос будет обработан, так как поток будет отложен в пуле потоков.

0
ответ дан 10 December 2019 в 00:46
поделиться