Обычно сервлеты запускаются только один раз, и веб-контейнер просто создает новый поток для каждого пользовательского запроса.
Первое утверждение верно, а второе на самом деле нет. Обычно потоки создаются один раз при запуске приложений и хранятся в пуле потоков. Когда поток завершил свое задание обработки запроса-ответа, он будет возвращен в пул. Вот почему использование ThreadLocal
в контейнере с сервлетами должно осуществляться с большой осторожностью.
Допустим, если я создаю свой собственный веб-контейнер с нуля, а вместо потоков я просто создаю сервлеты как Singleton. Я что-нибудь здесь упущу?
Они не обязательно должны следовать шаблону синглтона. Просто создайте только один их экземпляр во время запуска приложения и сохраняйте их в памяти на протяжении всего срока службы приложения и просто разрешите всем потокам обращаться к одному экземпляру.
Полагаю, в этом случае синглтон может обслуживать только один пользовательский запрос за раз, а не несколько.
Это не правда. Это произойдет только тогда, когда вы синхронизируете доступ к методам синглтона при блокировке всего приложения. Например, добавив модификатор synchronized
к методу вашего сервлета или synchronized(this)
в методе менеджера, который делегирует запросы к сервлетам.