【发布时间】:2017-03-21 23:46:03
【问题描述】:
我想知道为什么调用javax.servlet.Servlet#getServletConfig() 是线程安全的:如果您检查实现
javax.servlet.GenericServlet 来自 servlet API 3.0.1,您会看到以下内容:
package javax.servlet;
// lines omitted
public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Serializable
{
// lines omitted
private transient ServletConfig config;
// lines omitted
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
// lines omitted
public ServletConfig getServletConfig() {
return config;
}
// lines omitted
}
config 字段用init(ServletConfig) 编写,没有任何同步、锁定或config 易失性,而getServletConfig() 可以随时从servlet 容器的任何后续工作线程调用。我快速查看了 Tomcat/Catalina 代码库,但是我没有看到 servlet 容器执行任何魔法的迹象,这将保证线程安全访问字段 config 到 getServletConfig(),例如javax.servlet.GenericServlet#service(ServletRequest, ServletResponse)和javax.servlet.http.HttpServlet中的对应方法。
我在这里遗漏了什么吗?什么可以保证如果线程 A 用于 init(ServletConfig),那么调用 getServletConfig() 的线程 B 将看到字段 config 的正确状态(Java “happens-before”),而不是例如null?
【问题讨论】:
标签: java multithreading tomcat servlets thread-safety