jsp中方法的局部变量的线程安全性

时间:2013-06-10 14:02:26

标签: jsp thread-safety local-variables

在jsp threadsafe 中是否在用户定义的函数中声明变量?

例如在下面的代码片段中,变量'i'线程是否安全?

<%! public int increment()
{

            int i=0;
            return ++i ;
}

2 个答案:

答案 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使用情况并转移到ELJSTL

答案 1 :(得分:0)

你的问题毫无意义。

多个线程无法访问局部变量,因此线程安全问题不适用。

本地变量引用的实例可能对多个线程可见也可能不可见,并且可能是也可能不是线程安全的,具体取决于它的设计和使用方式。