нить локальные переменные в сервлете - PullRequest
6 голосов
/ 26 ноября 2008

Являются ли переменные threadlocals глобальными для всех запросов к сервлету, которому принадлежат переменные?

Я использую смолу для сервера.

Спасибо за удивление.

Я думаю, что могу сделать себя более ясным.

Конкретный случай:

Я хочу:

  • инициализировать статическую переменную, когда запрос начинает выполнение.
  • иметь возможность запрашивать значение переменной при дальнейшем выполнении методов, вызываемых из сервлета безопасным потоком, пока запрос не завершит выполнение

Ответы [ 5 ]

4 голосов
/ 17 декабря 2008

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

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

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

3 голосов
/ 26 ноября 2008

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

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

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

2 голосов
/ 17 декабря 2008

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

1 голос
/ 03 июня 2014

Использование ThreadLocal для хранения информации в области запроса может быть повреждено, если вы используете приостановленные запросы Servlet 3.0 (или Jetty Continuations) Использование нескольких потоков этих API обрабатывает один запрос.

0 голосов
/ 26 ноября 2008

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

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

...