关于java:servlet中的全局变量。

Global variable on servlet. is global for all sessions, or only for the current session?

本问题已经有最佳答案,请猛点这里访问。

我需要在应用程序运行时共享信息;如果我有:

1
2
3
4
5
6
7
public class example extends HttpServlet
{
    Object globalObject;

    doGet...
    doPost....
}

一个用户正在通过服务器和对象globalObject使用应用程序;如果另一个用户使用该应用程序,将与第一个用户共享该对象吗?


A user is using the aplication through server and the object globalObject; if another user use the application, will share the object with the first user?

对!不同的线程可能用于为不同的用户呈现请求,但使用了相同的servlet实例。因此,是的,变量对所有请求都是通用的。事实上,这就是为什么人们说我们不应该有全局变量to ensure thread safety


一般来说,线程是单件的,所以问题的答案是肯定的。但是,如果您想要在不同的用户之间共享数据,那么应该使用真正的单例实现。还要考虑并发性,因为您肯定有许多线程同时执行(服务器接收到的每个请求一个线程)。


这取决于应用服务器如何分配servlet。

如果您的应用程序服务器只分配一个servlet实例,那么是的,所有请求都将共享对全局变量的访问权,并且您必须在设计中考虑到这一点(除非您选择实现不推荐使用的SingleThreadModel接口,这将保证,尽管所有请求都可以访问全局变量,但它们不会访问同时进行。不要这样做。找到另一种方法)。

如果应用服务器分配了多个servlet实例,那么答案是"不一定"。

显然,您经常被蒙蔽在服务器的决定之外(关于是否实例化多个实例),因此您必须为安全而设计。


通过httpsession,变量将与每个用户会话相关,而不是与应用程序本身相关。

你可以这样做

1
2
3
4
5
6
ServletContext application = getServletConfig().getServletContext();  

String data ="test";  
application.setAttribute("variable", data);  

String data_rtrvd= (String) application.getAttribute("variable");

是否可以执行JSP代码:

1
<jsp:useBean id="obj" class="my.package.name.MyClass" scope="application" />

servlet处理的所有请求都将使用该变量的相同实例。servlet不是线程安全的,因为只创建了servlet的一个实例。

这将导致两个用户使用同一个globalObject实例。