Безопасность потоков в коде на стороне сервера
Я новичок в кодировании на стороне сервера и JSP/ сервлетов. У меня есть код, который имеет 3 класса. 1-й класс Serv, унаследованный от Java httpservlet. В этом я реализовал метод doPost(). В doPost() я использую объект 2-го класса ResourceClass. ResourceClass является одноэлементным классом. Следовательно, по сути, использовать любой метод - это сделать что-то вроде ResourceClass.getInstance(). ReadResource(); Теперь readResource furthur использует собственную библиотеку доступа Java для чтения ресурса с диска. Теперь мой вопрос: поскольку, как я понимаю, если 1000 клиентов подключаются к моему серверу (Apache Tomcat) для каждого нового запроса, у меня будет новый сервлет, обслуживающий запрос. Но все эти сервлеты будут по существу использовать один и тот же одноэлементный объект. Следовательно, это чтение будет потокобезопасным.
Я не изменяю никакое внутреннее состояние. Поэтому я думаю, что это не повлияет на мой результат, поэтому весь материал идемпотентен. Но будут ли все эти запросы поставлены в очередь, превращая объект класса Singleton в узкое место. Или у каждого сервлета будет своя копия.
Также, если я изменю состояние ресурса, то в этом случае оно будет поточно-ориентированным.
2 ответа
На сервере Java EE у вас есть только 1 экземпляр каждого сервлета. С другой стороны, каждый http-запрос обрабатывается сервером в своем собственном потоке.
Есть один случай ResourceClass
потому что это одиночка, так что у вас будет узкое место, если readResource()
метод синхронизирован.
Прежде всего, у вас не будет нового сервлета для каждого запроса. Тот же уникальный экземпляр сервлета будет использоваться для одновременной обработки всех запросов. Сервлет также является одноэлементным: веб-контейнер создает только один экземпляр.
Вы говорите, что запросы к вашему синглтону ResourceClass будут поставлены в очередь. Они не будут, если вы не отметите метод как synchronized
или используйте другой механизм блокировки. Если вы этого не сделаете, потоки будут вызывать ваш метод singleton одновременно.
Неважно, является ли он потокобезопасным или нет, не видя код вашего синглтона и код библиотеки JNI. Тот факт, что он доступен только для чтения, является признаком того, что он может быть поточно-ориентированным, но это не гарантируется.