具有同步块的Servlet init方法

sor*_*nki 5 java servlets

我有一个问题.在我的应用程序中,我有一个servlet,其初始化代码如下所示.

public class GameInitServlet extends HttpServlet {

private static boolean initialized = false;

 @Override
    public void init() throws ServletException {
        // This is a safeguard against running init() more than once.
        synchronized (GameInitServlet.class) {
            if (initialized) {

                LOG.error("GameInitServlet has already been initialized... Bailing out!");
                return;
            }
            initialized = true;
        }
        //some code here....
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:在web.xml中,上面的servlet在启动时加载为1,因此它将在启动应用程序时初始化.

所以我的问题是我们为什么要同步init方法.毕竟它将由servlet容器处理并且只被调用一次.我可以删除上述同步过程,或者删除后会对应用程序产生一些影响.

NIN*_*OOP 4

init()仅当 Servlet 最初在容器将创建的单个实例上加载到容器中时,才会执行一次。然后doGet()doPost()方法将作为单独的执行线程针对每个请求执行。我没有看到任何同步init()方法或其中的任何代码的点。即使在分布式环境中,每个 JVM也可能有一个 Servlet 实例。我认为容器足够聪明,init()在 Servlet 的生命周期中只调用一次,因此在多个线程执行之间不会有任何争用init()。根据Javadocs

Servlet 容器在实例化 Servlet 后仅调用一次 init 方法。init 方法必须成功完成,servlet 才能接收任何请求。