Спецификация сервлета для одноэлементного объекта сервлета

Для сервлетов, не реализующих интерфейс SingleThreadModel, если метод службы был определен с ключевым словом synchronized, контейнер сервлетов не может использовать подход с пулом экземпляров (выдержка из Спецификации сервлетов Java™ версии 2.5).

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


person Erdal76t    schedule 29.12.2015    source источник


Ответы (2)


Приведенная вами фраза не совсем ясна, но в моей интерпретации она хочет сказать следующее:

Если сервлет не реализует SingleThreadModel, но имеет синхронизированный метод service (или синхронизированные методы HttpServlet#doGet и т. д.), тогда контейнер сервлета не будет использовать пул экземпляров для сервлета.
Запросы будут просто сериализуются через синхронизацию потоков, и производительность будет плохой для одновременных запросов.

person wero    schedule 29.12.2015
comment
Почему контейнер serlet использует пул экземпляров только для одного экземпляра? - person Erdal76t; 29.12.2015
comment
@ Erdal76t Erdal76t Как я уже говорил в своем ответе, я думаю, что в описанном случае контейнер не вообще не использует пул экземпляров. - person wero; 29.12.2015
comment
Нет, ты не понял меня неправильно. — спрашиваю я снова. Если сервлет не реализует SingleThreadModel и не имеет метода синхронизированной службы, контейнер сервлета использует пул экземпляров. Но почему контейнер serlet использует пул экземпляров только для одного экземпляра? - person Erdal76t; 29.12.2015
comment
@ Erdal76t Erdal76t Я не вижу в цитате ничего, что указывало бы на то, что для такого сервлета используется пул. - person wero; 29.12.2015
comment
Я имел в виду, что контейнеры сервлетов всегда используют подход объединения для одноэлементного экземпляра сервлета, за исключением не определенного метода синхронизированной службы или реализации SingleThreadModel. Возможно, это произошло за кулисами. - person Erdal76t; 29.12.2015
comment
хорошо, что здесь упоминается пул сервлетов? - person Erdal76t; 29.12.2015
comment
@ Erdal76t Erdal76t Сюда помещается один экземпляр сервлета, и каждый запрос будет использовать его для выполнения своих обязанностей. Альтернативой может быть создание нового экземпляра сервлета для каждого запроса, но это плохо скажется на производительности. По этой же причине сервлет не может сохранять состояние. Если у вас есть 5 запросов, использующих один и тот же экземпляр, вы не можете быть уверены, что состояние не повреждено другими запросами. - person Kayaman; 29.12.2015
comment
Спецификация сервлета говорит, что Container использует пул экземпляров для одноэлементного сервлета. Пожалуйста, прочитайте правильно. это не про SingleThreadModel. - person Erdal76t; 29.12.2015

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

Контейнер может выбрать создание пула экземпляров сервлетов, реализующих javax. .servlet.SingleThreadModel для улучшения параллелизма. Затем каждый поток, обрабатывающий запрос, направленный к этому сервлету, может выполнять свой собственный экземпляр сервлета (возможно, полученный из пула) вместо блокировки до тех пор, пока не будет выполнен предыдущий запрос.

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

Чтобы ответить на ваш вопрос явно:

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

Однако все это спорно, потому что SingleThreadModel устарел, начиная с Servlet 2.4.

person Steve C    schedule 30.12.2015
comment
Пожалуйста, прочтите мою цитату из спецификации 2.5. Внимательно прочитайте. Для сервлетов, не реализующих интерфейс SingleThreadModel, и если метод службы был определен с ключевым словом synchronized, контейнер сервлетов не может использовать подход пула экземпляров. Это означает, что в противном случае контейнер сервлета использует пул для одного экземпляра или многих экземпляров за кулисами. - person Erdal76t; 30.12.2015
comment
Я читал исходный документ. Только SingleThreadModel сервлеты будут (потенциально) объединены в пул. - person Steve C; 30.12.2015
comment
2.3.3.1 Проблемы многопоточности // Для сервлетов, не реализующих интерфейс SingleThreadModel, если метод службы (или такие методы, как doGet или doPost, которые отправляются методу службы абстрактного класса HttpServlet) был определен с ключевым словом synchronized, контейнер сервлета не может использовать подход с пулом экземпляров, но должен сериализовать запросы через него. - person Erdal76t; 31.12.2015