0

在 jsp线程安全的用户定义函数中声明了一个变量吗?

例如在下面的代码片段中,变量“i”线程安全吗?

<%! public int increment()
{

            int i=0;
            return ++i ;
}
4

2 回答 2

1

在jsp线程安全的用户定义函数中声明了一个变量吗?

是的,它是线程安全的,因为只有当前线程可以访问它。如果该方法被多个线程调用,则每个线程将为此方法使用自己的局部变量。

进一步说明:

每个 JSP 都被编译成一个 Servlet,并将 HTML/CSS/JS 的编写分发到多个方法中(但这取决于应用程序服务器)。在 scriptlet 中声明的变量将在方法内部(不像您不能声明将跨 JSP 工作的字段),所有这些方法都是线程安全的。更多信息:JSF、Servlet 和 JSP 之间有什么区别?

现在的问题是,servlet 线程安全吗?这取决于您如何实现它们。有关此的更多信息:servlet 如何工作?实例化、会话、共享变量和多线程。从Threadsafety块可以看出,如果是通过编译 JSP 生成的 Servlet,它们将始终是线程安全的,因为在 scriptlet 中声明的所有变量都将在生成的 servlet 的某个方法中,而不是被声明为班级。

最后但并非最不重要的一点是,您不应该使用 scriptlet,因为非常不鼓励使用它们。您可以在此处找到有关它的进一步说明:如何避免 JSP 文件中的 Java 代码?. 如果您必须维护仍然使用 scriptlet 的遗留系统,那么您就不走运了,至少您可以建议慢慢放弃 scriptlet 的使用并转向ELJSTL

于 2013-06-10T14:58:07.713 回答
0

你的问题毫无意义。

一个局部变量不能被多个线程访问,所以线程安全的问题不适用。

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

于 2013-06-10T14:05:30.910 回答