Можно ли вызвать метод getAttribute () реализации Tomcat ServletContext без синхронизации? - PullRequest
1 голос
/ 30 марта 2010

Я хотел бы прочитать некоторые параметры во время инициализации сервлета (в методе init ()) и сохранить их среди атрибутов контекста сервлета (используя getServletContext (). SetAttribute ()). Я хотел бы прочитать эти параметры позже - во время обработки некоторых запросов (используя getServletContext (). GetAttribute ()). Таким образом, несколько потоков могут сделать это одновременно. Мой вопрос, является ли такая попытка безопасной? Могу ли я быть уверен, что многопоточные вызовы getAttribute () не портят внутреннее состояние контекста сервлета?

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

1 Ответ

6 голосов
/ 30 марта 2010

Основная реализация ServletContext в Tomcat - это класс ApplicationContext. Если вы посмотрите на связанный ресурс, вы увидите, что атрибуты хранятся в экземпляре java.util.concurrent.ConcurrentHashMap. Таким образом, для ApplicationContext как минимум методы getAttribute() и setAttribute() являются поточно-ориентированными.

...