Синхронизация сервлетов, когда несколько экземпляров - PullRequest
3 голосов
/ 31 декабря 2011

Я прочитал, что код в сервлетах можно синхронизировать с синхронизированными блоками. Однако я также читал, что, хотя часто существует только один экземпляр сервлета, контейнер сервлета может хранить пул экземпляров. Конечно, это означает, что синхронизированный блок не гарантированно будет работать, поскольку вы не знаете, какой экземпляр выберет поток запроса?

Ответы [ 3 ]

3 голосов
/ 31 декабря 2011

Раздел 2.2 спецификации (3.0) гласит:

Для сервлета, не размещенного в распределенной среде (по умолчанию), контейнер сервлета должен использовать только один экземпляр на сервлет Объявление

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

1 голос
/ 31 декабря 2011

Если вопрос состоит в том, как сделать сервлет однопоточным, то один из подходов заключается в реализации интерфейса SingleThreadModel, но теперь это устарело .

http://docs.oracle.com/javaee/1.4/api/javax/servlet/SingleThreadModel.html

1 голос
/ 31 декабря 2011

Контейнеры сервлетов действительно имеют пул потоков для обслуживания запросов, что означает, что, вероятно, будет несколько потоков, выполняющих код сервлетов, что означает, что доступ к любым совместно используемым изменяемым данным должен быть правильно синхронизирован.

...