Servlet 规范规定容器将实例化 my 的单个实例,并从多个工作线程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");
}
}
当然,如果我这样做:
public static void main(String[] argv) {
HttpServlet s = new Decider();
Thread t1 = new Thread(new Runnable() {
public void run() {
s.init(...);
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
s.doGet(...);
}
});
t1.start();
t2.start();
}
...然后我会有一个线程错误。是什么让容器必然不同?
编辑 2
所有断言“容器负责”的答案当然是受欢迎的,但我的问题特别是关于Servlet 规范是否保证这种行为。要充分回答这个问题,您必须参考 Servlet 规范。(任何版本,我都很酷)。