首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSP isThreadSafe默认值

问JSP isThreadSafe默认值
EN

Stack Overflow用户
提问于 2013-03-01 18:11:14
回答 4查看 25.5K关注 0票数 5

我学习jsp。我对jsp中的isThreadSafe属性有很大的困惑。缺省情况下,Jsp不是线程安全的,而不是isThreadSafe= true

如果设置为isThreadSafe=false,则意味着JSP引擎确保一次只有一个线程在执行您的JSP。

我分不清是真是假。isThreadSafe = false意味着只有多线程才能通过isThreadSafe访问jsp。

isThreadSafe的含义是什么?

代码语言:javascript
复制
     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"  %>

线程安全意味着多个线程不能同时访问jsp页面,对吗?

EN

回答 4

Stack Overflow用户

发布于 2013-03-01 18:13:42

此属性支持维护线程的功能,以便将多个并发请求从JSP容器发送到JSP页面。如果指定该属性的真值,否则,如果指定该属性的false值,则JSP容器一次只能发送一个请求。该属性的默认值为true。

线程安全的JSP/servlet是指在多个线程同时运行时能够正确工作的JSP/servlet。要使JSP线程安全,可以实现SingleThreadModel接口,以防止两个线程同时访问服务方法。

默认情况下,servlet容器认为JSP页面代码对于多个请求线程在单个实例中的重用是安全的。如果页面的代码冒着无意中跨同时请求共享其状态的风险,则以下指令将导致servlet容器在每个请求中使用页面的单独实例:

代码语言:javascript
复制
<%@ page isThreadSafe="false" %>

这样,您将加载和初始化servlet的N实例,并有效地同步每个实例的服务方法,而不是将为JSP页面生成的servlet的单个实例加载到内存中。通常,您可以通过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中共享。

票数 7
EN

Stack Overflow用户

发布于 2014-06-17 00:37:47

默认情况下,jsp页面不是线程安全的。默认情况下:

"<%@ page isThreadSafe="true“%>”

通过实现SingleThreadModel接口。当您在jsp页面中声明它时。

"<%@ page isThreadSafe="false“%>”

这意味着jsp容器将接受多个请求,一次只能发送一个请求。

但当您使用以下命令在同一中声明任何变量时:

"<%!声明%>“

这意味着你设置了"isThreadSafe = true“。表示此变量不是线程安全的..而jsp容器不能控制这个变量。由于这个原因,SingleThreadModel失败了。

这就是为什么不推荐正常使用SingleThreadModel的原因。有许多缺陷,包括上面的无法使用<%!%>的示例

票数 3
EN

Stack Overflow用户

发布于 2013-03-01 18:14:50

默认情况下,JSP不是自动线程安全的。如果您的实例变量是在JSP的服务部分中修改的,那么它们将被导致并发问题的所有请求共享。servlets的情况也是如此。与servlets一样,有一种机制可以帮助您提高JSP的线程安全性,这就是可以在JSP页面指令中设置的isThreadSafe属性。这种技术类似于用servlet实现过时的SingleThreadModel接口。事实上,大多数容器通过让生成的代码实现这个废弃的接口来实现线程安全的JSP。

对于servlets来说,这并不是最好的想法,这就是为什么SingleThreadModel被弃用的原因。这不是一个好主意,因为即使在使用它时,也有可能编写不是线程安全的servlet。

因此,简而言之,您应该避免依赖JSP中的threadSafe指令,原因与您应该避免在servlet中使用不推荐使用的SingleThreadModel接口的原因相同。

完全避免scriptlet是当前公认的最佳实践。没有scriptlet的JSP将没有实例变量,这将使您在拥有线程安全的JSP方面走得很远。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15155157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档