Как я могу создать потокобезопасную страницу JSP - PullRequest
7 голосов
/ 26 августа 2010

Я хочу создать потокобезопасную страницу JSP.Это возможно в сервлете путем реализации интерфейса SingleThreadModel, но я не знаю, как это сделать на странице JSP.

Ответы [ 6 ]

9 голосов
/ 26 августа 2010

Теоретически, страницы JSP могут быть обозначены как поточно-ориентированные через атрибут директивы страницы isThreadSafe. Установка значения false приведет к тому, что контейнер будет синхронизировать доступ к объектам уровня страницы (а не к объектам сессий и областям приложения или объектам любой другой разновидности). Очевидно, что все еще ответственность за обеспечение синхронного доступа к потокам небезопасных областей кода лежит на разработчике.

Morevoer, интерфейс SingleThreadModel также объявлен устаревшим в выпуске 2.4 Спецификации сервлета. Интерфейс SingleThreadModel используется для реализации предполагаемой безопасности потоков в JSP, а сгенерированные классы сервлетов будут реализовывать SingleThreadModel для JSP, которые используют атрибут threadsafe. Сама спецификация обрисовывает в общих чертах, почему интерфейс устарел:

SRV.2.2.1 Примечание о модели с одной резьбой

Использование SingleThreadModel интерфейс гарантирует, что только один поток одновременно будет выполняться в обслуживание данного экземпляра сервлета метод. Важно отметить, что эта гарантия распространяется только на каждого экземпляр сервлета, так как контейнер может выбрать для объединения таких объектов. Объекты, которые доступны для более чем один экземпляр сервлета за раз, такие как экземпляры HttpSession, могут быть доступным в любое конкретное время несколько сервлетов, в том числе которые реализуют SingleThreadModel.

Рекомендуется разработчику принять другие средства, чтобы решить эти проблемы вместо реализации этого интерфейс, например, избегая использования переменной экземпляра или синхронизировать блок кода доступ к этим ресурсам. Интерфейс SingleThreadModel не рекомендуется в этой версии спецификация.

5 голосов
/ 26 августа 2010

Сначала короткий ответ <% @ page isThreadSafe = "false"%>

Более длинный ответ: не делай этого.

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

Для меня это означает, что у вас есть что-то подобное в коде сервлета:

   doGet(/*etc/*){

       // ... stuff

           someExistingUnsafeClass.doSomething();

       // .. more stuff

   }

В конце концов, сам ваш код сервета не может быть потокобезопасным, не так ли? Вы бы это исправили, верно? Так что, должно быть, какой-то устаревший код небезопасен?

Если это сценарий, когда вашему JSP нужно использовать этот существующий унаследованный код, где-то в вашем JSP есть вызов, который небезопасен:

<%
         someExistingUnsafeClass.doSomething();
%>

Так что вам просто нужно защитить этот небезопасный вызов:

<%
  synchronized(this){
         someExistingUnsafeClass.doSomething();

  };
%>

Разрешение правильной работы многопоточной JSP будет работать намного лучше.

Я также должен сказать, что если вы структурируете свое приложение как MVC, тогда весь небезопасный код вызывается из контроллера, и представление (JSP) никогда не должно быть небезопасным.

3 голосов
/ 26 августа 2010

Отсутствие информации о состоянии на странице JSP .(Нет переменных экземпляра, которые могут изменяться в зависимости от разных запросов).Если в вашем JSP или сервлете нет состояния, оно поточно-ориентированное

1 голос
/ 26 августа 2010

В JSP просто используйте переменные в скриптах, и вы можете быть уверены, что они являются поточно-ориентированными, потому что они будут переведены в локальную переменную в service().

1 голос
/ 26 августа 2010

Говорить о безопасности потоков с JSP неправильно - JSP - это технология просмотра, которая отображает только результаты - она ​​не выполняет никакой обработки. (он может выполнять обработку, но не должен)

Потоковая безопасность с сервлетами достигается благодаря наличию нет закрытых полей в сервлете - экземпляр сервлета является единым для всего контейнера, и каждый запрос является новым потоком, вызывающим метод service(..).

Вы должны точно указать, что вы подразумеваете под "безопасностью потоков" в вашем случае - то есть, что вы ожидаете потерпеть неудачу.

0 голосов
/ 26 августа 2010

Ты не.

JSP - это, по сути, единственный метод в сервлете.Как вы, возможно, уже знаете, методы являются поточно-ориентированными, в том смысле, что два потока, вызывающие один и тот же метод одного и того же объекта в одно и то же время, будут выполнять каждый в своем стеке.

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

Если вы объявите переменную a в JSP, нетКстати, другой запрос видит эту переменную.

То, что вы должны знать, это то, что объекты, помещенные в сеанс, или контекст могут быть доступны для нескольких потоков одновременно, или в значительной степени не является потокобезопасным кодом.Тогда вы должны синхронизировать или заботиться о этих объектах! , а не о странице JSP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...