我学习jsp.我在jsp中的isThreadSafe属性中有很大的困惑.默认情况下,Jsp不是线程安全的isThreadSafe= true
如果我们设置isThreadSafe=false意味着JSP引擎确保一次只有一个线程正在执行您的JSP.
我有真或假的混淆.isThreadSafe = false意味着只有muliple线程可以通过isThreadSafe访问jsp
isThreadSafe是什么意思?
The isThreadSafe option marks a page as being thread-safe.
By default, all JSPs are considered thread-safe. If you set the isThreadSafe option to false, the JSP engine makes sure that only one thread at a time is executing your JSP.
The following page directive sets the isThreadSafe option to false:
<%@ page isThreadSafe="false" %>
Run Code Online (Sandbox Code Playgroud)
线程安全意味着多个线程无法一次访问jsp页面是否正确?
如果指定属性的真值,则此属性支持维护线程以便将多个和并发请求从JSP容器发送到JSP页面,否则如果指定属性的false值,则JSP容器只能发送一个请求在一次.该属性的默认值为true.
线程安全的JSP/servlet是在多个线程同时运行时正常工作的JSP/servlet.要使JSP的线程安全,可以实现SingleThreadModel阻止两个线程同时访问服务方法的接口.
默认情况下,servlet容器认为JSP页面代码可以安全地在多个请求线程的单个实例中重用.如果页面的代码存在无意中跨同时请求共享其状态的风险,则以下指令将导致servlet容器在每个请求中使用页面的单独实例:
<%@ page isThreadSafe="false" %>
Run Code Online (Sandbox Code Playgroud)
这样,代替为内存中加载的JSP页面生成的servlet的单个实例,您将加载和初始化servlet的N个实例,并且每个实例的服务方法都有效地同步.您通常可以通过JSP引擎的管理屏幕控制为实现SingleThreadModel的所有servlet实例化的实例数(N).
您的JSP是否是线程安全的是您实现JSP的方式的结果.当JSP中的代码避免保持状态(例如成员和会话变量)时,servlet容器可以依赖"isThreadSafe"属性的默认"true"值来更快地回复并且内存占用更少.
例如,如果您碰巧使用<%! %>,则会将代码放在类级别而不是_jspService方法中.将类成员引入JSP开启了一种在单实例使用中失去线程安全性的方法.
如果您的JSP作为服务于并行请求的单个实例不是线程安全的,则必须添加isThreadSafe=false以使事情正常工作.这将通过指示servlet容器解决JSP的线程不安全来保留Web应用程序的线程安全性,但代价是:
如果isThreadSafe = true,那么JSP容器可以选择同时向页面分派多个未完成的客户端请求.使用true的页面作者必须确保它们正确地同步对页面共享状态的访问.
如果isThreadSafe = false,那么JSP容器应按照接收顺序一次一个地分配多个未完成的客户端请求到页面实现进行处理.
请注意,即使该isThreadSafe属性为false,JSP页面作者也必须确保正确同步对任何共享对象的访问.可以在ServletContext或HttpSession中共享对象.
| 归档时间: |
|
| 查看次数: |
23602 次 |
| 最近记录: |