Потокобезопасность в коде на стороне сервера

Я новичок в кодировании на стороне сервера и JSP/сервлетах. У меня есть код, который имеет 3 класса. 1-й — это класс Serv, унаследованный от java httpservlet. В этом у меня реализован метод doPost(). В doPost() я использую объект 2-го класса ResourceClass. ResourceClass — это одноэлементный класс. Следовательно, по существу, для использования любого метода нужно сделать что-то вроде ResourceClass.getInstance().readResource(); Теперь readResource furthur использует библиотеку доступа Java Native для чтения ресурса с диска. Теперь мой вопрос: поскольку, как я понимаю, если 1000 клиентов подключатся к моему серверу (Apache Tomcat) для каждого нового запроса, у меня будет новый сервлет, обслуживающий запрос. Но все эти сервлеты по существу будут использовать один и тот же объект singleton. Следовательно, это чтение будет потокобезопасным.

Я не меняю никакого внутреннего состояния. Поэтому я думаю, что это не повлияет на мой вывод, поэтому все это идемпотентно. Но будут ли все эти запросы поставлены в очередь, что сделает объект класса singleton узким местом. Или у каждого сервлета будет своя копия.

Также, если я изменю состояние ресурса, тогда в этом случае он будет потокобезопасным.


person user1294764    schedule 03.05.2012    source источник


Ответы (2)


Прежде всего, у вас не будет нового сервлета для каждого запроса. Один и тот же уникальный экземпляр сервлета будет использоваться для одновременной обработки всех запросов. Сервлет также является синглтоном: веб-контейнер создает только один экземпляр.

Вы говорите, что запросы к вашему синглтону ResourceClass будут поставлены в очередь. Они не будут, если вы не пометите метод как synchronized или не используете какой-либо другой механизм блокировки. Если вы этого не сделаете, потоки будут одновременно вызывать ваш одноэлементный метод.

Поточно-ориентированный он или нет, невозможно сказать, не видя код вашего синглтона и код библиотеки JNI. Тот факт, что он доступен только для чтения, является признаком того, что он может быть потокобезопасным, но это не гарантируется.

person JB Nizet    schedule 03.05.2012
comment
Спасибо, Джей Би. Я думаю, что мне следует прочитать хороший учебник о том, как слово контейнеров сервлетов. Ваш ответ очень информативен. - person user1294764; 07.05.2012

На сервере Java EE у вас есть только 1 экземпляр каждого сервлета. С другой стороны, каждый http-запрос обрабатывается сервером в своем собственном потоке.

Существует один экземпляр ResourceClass, потому что это синглтон, поэтому у вас будет узкое место, если метод readResource() будет синхронизирован.

person user1310749    schedule 03.05.2012