2012-01-14 2 views
2

Когда мы создаем сервлет, почему переменные класса (экземпляра и статические переменные) НЕ являются потокобезопасными?Нитки-сервлеты

Почему методы doPost() и doGet() являются потокобезопасными?

Я думаю, что каждый новый запрос на контейнер сервлета создает новый экземпляр класса сервлета (который расширяет HttpServlet). У каждого экземпляра есть собственные переменные класса, размещенные в памяти, а затем w Мы должны сделать эти переменные потоками безопасными?

+2

Обычно контейнер не будет создавать новый экземпляр сервлета для каждого запроса. –

+0

вам нужно знать, где переменные класса и локальные переменные помещаются в jvm.What являются областью этих переменных. –

ответ

9

Сервлет устанавливается только один раз: при погрузке. Затем, когда клиенты делают запросы, они имеют резьбу.

Это объясняет, почему вы должны поставить мониторы, где это необходимо, и т.д.

С doGet и doPost зависит от запроса, он является поточно-: если вы планируете сделать атомную операцию в doGet и doPost, вам следует рассмотреть возможность создания синхронизированного метода/блока.

+0

спасибо. то естьесли у меня есть класс с небезопасной переменной класса, я должен использовать эту переменную внутри doGet (doPost) в синхронизированном блоке, или мне нужно передать код, который использует эту переменную, в синхронный метод и использовать этот метод в doGet (doPost)? – MyTitle

+0

Если бы мне пришлось это сделать, я буду использовать сеттер, который будет синхронизированным методом. – delannoyk

1

Когда мы создаем сервлет, почему переменные класса (экземпляры и статические переменные) НЕ являются потокобезопасными?

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

Почему методы doPost() и doGet() являются потокобезопасными?

doPost() и doGet() потокобезопасны, если вы используете локальные переменные в этих методах. Если вы изменяете состояние общих переменных (экземпляра или статические переменные) в этих методах, doPost() и doGet() не являются потокобезопасными.

У каждого экземпляра есть собственные переменные класса, размещенные в памяти, то почему мы должны сделать эти переменные потоками безопасными?

Один экземпляр существует для одного сервлета. Запросы, такие как doGet() или doPost(), создают несколько потоков на одном экземпляре. Пока вы используете локальные varaibles в этих методах, код является потокобезопасным.

Вы можете найти хорошую информацию в этом посте:

How do servlets work? Instantiation, sessions, shared variables and multithreading