- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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/
ServletConfig 和 ServletContext 接口(interface)有什么区别? 最佳答案 ServletConfig 参数是为特定 servlet 指定的,其他 servlet
解读 Servlet 源码:GenericServlet,ServletConfig,ServletContext 每博一文案
这是一个关于嵌入 jetty 7 的例子: http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty public class OneServlet
尝试将初始化参数名称添加到 init(ServletConfig) 方法中的列表。 public void init(ServletConfig sc){ try { supe
我有一个使用插件架构的 Java 网络应用程序。我想知道是否有人有解决方案可以添加一个 servlet,并在 Web 应用程序运行时将 serlvet 映射到 servletconfig?这个想法是可
我有一个问题是: java.lang.Exception: ServletConfig has not been initialized 我搜索了将近 2 天,但没有找到适合我的解决方案。每个人都说过
有没有办法在应用于该 servlet 的 Filter 中获取 servlet 的 ServletConfig 对象? Edit-> 场景是我提到的角色名称(谁可以访问 servlet) 在 web.
显然以下正在生成一个循环(GenericServlet 类正在调用子类的init()) public void init() throws ServletException { ServletCo
我正在尝试覆盖 init(ServletConfig config) 方法。我的代码是: public void init(ServletConfig config) throws ServletE
嗨,我想知道当我们使用它们的serve().with()绑定(bind)路由时,Guice如何将隐式对象传递到Servlet中?我定义了一个自定义 Router servlet,它将创建 Servle
我知道,当 Servlet 容器实例化 Servlet 对象时,它还会创建相应的 ServletConfig 对象,其中存储该 servlet 的所有 init-params(我们稍后可以通过 ser
这个问题已经有答案了: How to configure programmatically without web.xml (2 个回答) 已关闭 5 年前。 如果我想修改 ServletConte
这个问题已经有答案了: I am trying to load or u can say register my sql jdbc driver with the use of ServletConf
我能够从其他方式加载我的 mysql jdbc 驱动程序,但是当我尝试使用 servletconfig 接口(interface)注册它时,它给出了异常 java.lang.ClassNotFound
我尝试运行以下几行。 ${initParam.tagline} ${pageContext.servletConfig.initParameter("adminco
我整天都在为此奋斗:我有 DynamicWebProject。它运作良好。但在某些时候,我决定清理项目中未使用的额外 jar 。清理后,我遇到了很多错误。所以我回滚了所有更改(我的意思是我重新调整了所
Servlet 规范规定容器将实例化我的 java.servlet.HttpServlet 的单个实例,并调用服务方法 (doGet()/ doPost()) 来自多个工作线程。 根据正常的线程规则,
尝试设置我的第一个 REST API(使用 Jersey 2 和 Gradle)并使用 swagger 添加一些文档。但是当添加 swagger 依赖项并遵循 this 时swagger 文档,“Us
我是一名优秀的程序员,十分优秀!