我需要在应用程序运行时共享信息;如果我有:
public class example extends HttpServlet
{
Object globalObject;
doGet...
doPost....
}
用户通过服务器和对象globalObject使用aplication;如果其他用户使用该应用程序,将与第一个用户共享该对象?
答案 0 :(得分:2)
用户通过服务器和对象globalObject使用aplication;如果其他用户使用该应用程序,将与第一个用户共享该对象?
是!不同的线程可能会用于为不同的用户呈现请求,但使用相同的servlet实例。所以变量对所有请求都是通用的。事实上,这就是为什么说我们不应该有全局变量to ensure thread safety
。
答案 1 :(得分:1)
servlet处理的所有请求都将使用相同的变量实例。 Servlet不是线程安全的,因为只创建了一个servlet实例。
这将导致两个用户使用globalObject
的相同实例。
答案 2 :(得分:1)
使用HttpSession,您的变量将与每个用户会话相关,而不是与应用程序本身相关
您可以按照以下方式执行此操作
ServletContext application = getServletConfig().getServletContext();
String data = "test";
application.setAttribute("variable", data);
String data_rtrvd= (String) application.getAttribute("variable");
您可以执行JSP代码:
<jsp:useBean id="obj" class="my.package.name.MyClass" scope="application" />
答案 3 :(得分:1)
这取决于应用程序服务器如何分配servlet。
如果您的应用程序服务器只分配一个servlet实例,那么所有请求都将共享对全局变量的访问权限,您必须考虑设计中的那个(除非您选择实现已弃用的SingleThreadModel
接口,将保证,虽然所有请求都可以访问全局变量,但它们不会同时访问它。不要这样做。找另一种方式)。
如果您的应用程序服务器分配了多个servlet实例,则答案是“不一定”。
显然,您经常被屏蔽掉服务器的决定(关于是否实例化多个实例),因此您必须设计安全性。
答案 4 :(得分:1)
一般来说,线程是单身,所以你的问题的答案是肯定的。但是,如果要在不同用户之间共享数据,则应使用真正的Singleton实现。还要考虑并发性,因为你肯定会有许多线程同时执行(服务器收到的每个请求都有一个)