gpt4 book ai didi

java - 如果我在 HttpServlet#init(ServletConfig) 中分配实例字段,Servlet 规范是否保证我可以在 doGet() 中读取它们?

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:42 25 4
gpt4 key购买 nike

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");
}

}

当然,如果我要这样做:

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 规范。 (任何版本,我都很酷)。

最佳答案

这在init中有明确说明javadoc :

The servlet container calls the init method exactly once after instantiating the servlet. The init method must complete successfully before the servlet can receive any requests.

如果您遵循 servlet 生命周期,它表示 servlet 应该在来自多个线程的 service 请求之前被 init 编辑。

关于java - 如果我在 HttpServlet#init(ServletConfig) 中分配实例字段,Servlet 规范是否保证我可以在 doGet() 中读取它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19157806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com