diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java index 418a3ddb9c8..af71aa06b8b 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java @@ -95,7 +95,7 @@ public class EmbeddedWebApplicationContext extends GenericWebApplicationContext */ public static final String DISPATCHER_SERVLET_NAME = ServletContextInitializerBeans.DISPATCHER_SERVLET_NAME; - private EmbeddedServletContainer embeddedServletContainer; + private volatile EmbeddedServletContainer embeddedServletContainer; private ServletConfig servletConfig; @@ -138,10 +138,10 @@ public class EmbeddedWebApplicationContext extends GenericWebApplicationContext @Override protected void finishRefresh() { super.finishRefresh(); - startEmbeddedServletContainer(); - if (this.embeddedServletContainer != null) { - publishEvent(new EmbeddedServletContainerInitializedEvent(this, - this.embeddedServletContainer)); + EmbeddedServletContainer localContainer = startEmbeddedServletContainer(); + if (localContainer != null) { + publishEvent( + new EmbeddedServletContainerInitializedEvent(this, localContainer)); } } @@ -151,15 +151,17 @@ public class EmbeddedWebApplicationContext extends GenericWebApplicationContext stopAndReleaseEmbeddedServletContainer(); } - private synchronized void createEmbeddedServletContainer() { - if (this.embeddedServletContainer == null && getServletContext() == null) { + private void createEmbeddedServletContainer() { + EmbeddedServletContainer localContainer = this.embeddedServletContainer; + ServletContext localServletContext = getServletContext(); + if (localContainer == null && localServletContext == null) { EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory(); this.embeddedServletContainer = containerFactory .getEmbeddedServletContainer(getSelfInitializer()); } - else if (getServletContext() != null) { + else if (localServletContext != null) { try { - getSelfInitializer().onStartup(getServletContext()); + getSelfInitializer().onStartup(localServletContext); } catch (ServletException ex) { throw new ApplicationContextException("Cannot initialize servlet context", @@ -284,16 +286,19 @@ public class EmbeddedWebApplicationContext extends GenericWebApplicationContext } } - private void startEmbeddedServletContainer() { - if (this.embeddedServletContainer != null) { - this.embeddedServletContainer.start(); + private EmbeddedServletContainer startEmbeddedServletContainer() { + EmbeddedServletContainer localContainer = this.embeddedServletContainer; + if (localContainer != null) { + localContainer.start(); } + return localContainer; } - private synchronized void stopAndReleaseEmbeddedServletContainer() { - if (this.embeddedServletContainer != null) { + private void stopAndReleaseEmbeddedServletContainer() { + EmbeddedServletContainer localContainer = this.embeddedServletContainer; + if (localContainer != null) { try { - this.embeddedServletContainer.stop(); + localContainer.stop(); this.embeddedServletContainer = null; } catch (Exception ex) {