2015-07-25 4 views
0

Я видел очень интересное сообщение 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(); 
     } 
    } 
  1. Требуется ли синхронизация для манипулирования области применения в технологии/Servlet JSP?
  2. Если да, следует ли использовать синхронизацию (locks) для setAttribute(), а также getAttribute() или setAttribute() достаточно?

Спасибо.

EDIT:

Я видел подобную тему с более подробной here². Чтобы поднять Servlet Specification 3.1 (read §4.5), только говорят, что атрибуты в контексте могут быть разделены между различными сервлетами в одном и том же веб-приложении, но явно не говорят, являются ли setAttribute/getAttribute потоковыми (ни Javadoc). Некоторые контейнеры сервлетов, такие как Tomcat, используют реализацию ConcurrentHashmap (но это не входит в спецификацию). В заключение я также прочитал, что хорошей практикой является использование неизменяемых/потокобезопасных объектов для значений.

+0

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

ответ

-3
  1. Короткий ответ да. Это связано с тем, что каждый входящий запрос на сервер обрабатывается в другом потоке. Поскольку контекст приложения является общим для всех запросов, это означает, что к нему можно получить доступ одновременно.

  2. Я бы пошёл для обоих, просто чтобы быть в безопасности. Я даже советую вам обернуть весь блок, имея дело с модификацией объекта, хранящегося в контексте приложения, в синхронизированном блоке. Я также попытался бы использовать этот контекст как можно меньше, поскольку он приносит много накладных расходов, и если он не будет осторожен, это может вызвать проблемы.

+0

Кто-то дал вам «-1» (не мне), я не понимаю, почему, потому что ваш ответ кажется логичным. – Gugelhupf

+0

Это логично, если вы игнорируете контекст. Контекст заключается в том, что, хотя стеки сервлета, в которых эти операции не были потокобезопасными *, могли быть совместимы с буквой спецификации, большинство программистов назвали бы ее BROKEN. Кроме того, вам не нужно делать предположения. Посмотрите на исходный код. –

+0

В спецификации нет ничего, что обеспечивало бы неизменность объектов, их сохранение или безопасность потока реализации. Поскольку конкретного примера не было, я принял наихудший случай - что объект, о котором идет речь, изменен, и, если они действительно есть, они имеют доступ к ним, должны быть сериализованы. Я также соглашаюсь с тем, что непреложный путь, но я не понимаю, почему мой ответ считается неправильным. –

 Смежные вопросы

  • Нет связанных вопросов^_^