Я видел очень интересное сообщение here, похоже, что люди в ASP.NET должны синхронизировать свой доступ к области приложения, поэтому мне было интересно, имеют ли те же самые ограничения, которые развивают технологию Java EE JSP/Servlet.Java EE Servlet - Должен ли я синхронизировать каждый доступ к области приложения?
Вот пример:
public class MyServlet extends HttpServlet {
private static Lock applicationScopeLock = new ReentrantLock();
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response){
applicationScopeLock.lock();
try {
ServletContext appScope = this.getServletContext();
appScope.setAttribute("myKey", new MyValue());
} finally {
applicationScopeLock.unlock();
}
}
- Требуется ли синхронизация для манипулирования области применения в технологии/Servlet JSP?
- Если да, следует ли использовать синхронизацию (locks) для setAttribute(), а также getAttribute() или setAttribute() достаточно?
Спасибо.
EDIT:
Я видел подобную тему с более подробной here². Чтобы поднять Servlet Specification 3.1 (read §4.5), только говорят, что атрибуты в контексте могут быть разделены между различными сервлетами в одном и том же веб-приложении, но явно не говорят, являются ли setAttribute/getAttribute потоковыми (ни Javadoc). Некоторые контейнеры сервлетов, такие как Tomcat, используют реализацию ConcurrentHashmap (но это не входит в спецификацию). В заключение я также прочитал, что хорошей практикой является использование неизменяемых/потокобезопасных объектов для значений.
Я думаю, что это так близко к дубликату, что это не имеет никакого значения. Разумеется, применимы аргументы в связанном вопросе. –