5

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

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

我对真假感到困惑。isThreadSafe = false表示只有多线程可以通过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"  %>

线程安全意味着多个线程一次不能访问jsp页面是否正确?

4

4 回答 4

7

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

线程安全的 JSP/servlet 是一种在多个线程同时运行时可以正常工作的 JSP/servlet。为了使您的 JSP 线程安全,您可以实现SingleThreadModel防止两个线程同时访问服务方法的接口。

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

<%@ page isThreadSafe="false" %>

这样,为您的 JSP 页面生成的单个 servlet 实例不会加载到内存中,您将加载和初始化N个 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属性为假,JSP 页面作者也必须确保对任何共享对象的访问都正确同步。这些对象可以在 ServletContext 或 HttpSession 中共享。

于 2013-03-01T10:13:42.413 回答
3

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

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

通过实现 SingleThreadModel 接口。当你在jsp页面中声明这个

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

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

但是,当您使用以下方法声明任何变量时:

“<%!声明 %>”

这意味着您设置了“isThreadSafe = true”。意味着这个变量不是线程安全的......并且jsp容器无法控制这个变量。由于这个原因 SingleThreadModel 失败。

这就是为什么不建议正常使用 SingleThreadModel 的原因。陷阱很多,包括上面的例子不能使用 <%! %>

于 2014-06-16T16:37:46.503 回答
1

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

对于 servlet,结果证明这不是最好的想法,这就是不推荐使用 SingleThreadModel 的原因。这不是一个好主意,因为即使在使用它时,也可以编写一个非线程安全的 servlet。

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

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

于 2013-03-01T10:14:50.377 回答
-1

在jsp中,您使用的局部变量总是jsp是线程安全的,假设您使用的是实例变量jsp,s不是线程安全的。您必须指定 isThreadSafe

于 2013-07-24T13:05:00.950 回答