我有这样一种情况,我的代码运行在嵌入式服务器和Web应用程序之间共享单例。我有一个包含类和部署工具的war文件。当我使用printf方法打印实例时,我看到:
abc.Abc@173a10f
abc.Abc@105738
所以这并不是真正的单例模式。它是如何工作的?
我的Jetty服务器启动代码:
public static void main(String[] args) throws Exception
{
System.out.println(MySingleton.getInstance());
// start Jetty here and deploy war with WebAppContext()
}
我的 ServletContextListener
代码:
public class AppServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println(MySingleton.getInstance());
}
}
我的单例模式:
public class MySingleton {
private static MySingleton INSTANCE = new MySingleton();
private MySingleton () {}
public static MySingleton getInstance() {
return INSTANCE;
}
}
我在构造函数中强制抛出异常。看起来我得到了两个不同的结果。
java.lang.Exception
at api.MySingleton.<init>(MySingleton.java:33)
at api.MySingleton.<clinit>(MySingleton.java:22)
at my.project.StartJetty.main(StartJetty.java:41)
java.lang.Exception
at api.MySingleton.<init>(MySingleton.java:33)
at api.MySingleton.<clinit>(MySingleton.java:22)
at api.AppServletContextListener.contextInitialized(AppServletContextListener.java:25)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:640)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:229)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1208)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:586)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:449)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58)
at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:224)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89)
at org.eclipse.jetty.server.Server.doStart(Server.java:258)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58)
at my.project.StartJetty.main(StartJetty.java:66)
AppServletContextListener
和main
方法是否在同一个JVM中执行? - Sotirios DelimanolisClassLoader
加载其自己的MyInstance
类实例。 - Sotirios DelimanolisMySingleton
类是否被多个ClassLoader
加载了?如果你的JVM中有两个不相互通信的加载器,那么同一个类的两个不同定义可能会同时存在(例如,在NetBeans RCP框架中经常发生这种情况,所以这并不是前所未有的)。 - CodeBlind