假设,我有一个拥有大量servlet的Web服务器.对于在这些servlet之间传递的信息,我正在设置会话和实例变量.
现在,如果有2个或更多用户向此服务器发送请求,那么会话变量会发生什么?它们对所有用户都是通用的,或者对于每个用户而言都是不同的.如果它们不同,那么服务器如何区分不同的用户?
还有一个类似的问题,如果有n
用户访问特定的servlet,那么这个servlet只在第一个用户第一次访问它时实例化,或者是否为所有用户单独实例化?换句话说,实例变量会发生什么?
java multithreading servlets session-variables instance-variables
Servlet规范规定容器将实例化我的单个实例java.servlet.HttpServlet
,并从多个工作线程调用服务方法(doGet()
/ doPost()
).
根据正常的线程规则,不能保证init(ServeltConfig)
"之前发生的" 实例级字段的分配由执行的其他线程从那些相同的字段读取doGet()
,除非有人在某个时刻安排同步.
实际上,容器实际上可以进行某种外部同步,以确保init()
"后续"线程可以看到完成的工作.
但是,Servlet规范是否明确保证我是线程安全的?我现在无法找到这样的保证,虽然我必须承认,自从Servlet 2.4以来,我还没有从端到端读取规范.
编辑
例如,由于一些回答者将事情搞砸了,我的问题是:Servlet规范是什么说下面的类是线程安全的?
@WebServlet (initParams = {@WebInitParam(name="b", value="true")})
public Decider extends HttpServlet {
private boolean b = false;
public void init(ServletConfig config) {
this.b = Boolean.parseBoolean(config.getAttribute("b"));
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
res.sendRedirect(b ? "/true" ? "/false");
}
}
Run Code Online (Sandbox Code Playgroud)
当然,如果我这样做:
public static void main(String[] argv) {
HttpServlet s = new Decider();
Thread t1 = new Thread(new Runnable() {
public …
Run Code Online (Sandbox Code Playgroud)