在jsp threadsafe 中是否在用户定义的函数中声明变量?
例如在下面的代码片段中,变量'i'线程是否安全?
<%! public int increment()
{
int i=0;
return ++i ;
}
答案 0 :(得分:1)
是否在jsp threadsafe中的用户定义函数内声明了变量?
是的,它是线程安全的,因为只有当前线程才能访问它。如果该方法由多个线程调用,则每个线程将为此方法使用自己的局部变量。
进一步解释:
每个JSP都被编译成一个Servlet,并将跨多个方法分发HTML / CSS / JS的编写(这取决于应用程序服务器)。在scriptlet中声明的变量将在内部方法中(不像你不能声明一个可以跨JSP工作的字段),所有这些方法都是线程安全的。更多信息:What is the difference between JSF, Servlet and JSP?
现在的问题是,servlet线程安全吗?这取决于你如何实现它们。有关此问题的更多信息:How do servlets work? Instantiation, sessions, shared variables and multithreading。正如您从 Threadsafety 块中看到的,如果通过编译JSP生成Servlet,它们将始终是线程安全的,因为在scriptlet中声明的所有变量都将位于生成的servlet的某个方法内,而不是被宣布为班级的一个领域。
最后但并非最不重要的一点是,不应使用scriptlet,因为非常不鼓励。您可以在此处找到有关它的进一步说明:How to avoid Java code in JSP files?。如果您必须维护仍使用scriptlet的旧系统,那么您运气不好,至少您可以建议慢慢删除scriptlet使用情况并转移到EL和JSTL。
答案 1 :(得分:0)
你的问题毫无意义。
多个线程无法访问局部变量,因此线程安全问题不适用。
本地变量引用的实例可能对多个线程可见也可能不可见,并且可能是也可能不是线程安全的,具体取决于它的设计和使用方式。