gpt4 book ai didi

java - 单例并不是真正的单例

转载 作者:搜寻专家 更新时间:2023-11-01 01:35:12 24 4
gpt4 key购买 nike

我有这样的情况,我在运行嵌入式服务器的代码和我的网络应用程序之间共享单例。我与类和部署工具有冲突。当我打印实例时,我看到:

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)

最佳答案

看看一些Jetty documentation .您可以尝试使用类加载配置。

If set to true, then Jetty uses normal JavaSE classloading priority, and gives priority to the parent/system classloader. This avoids the issues of multiple versions of a class within a webapp, but the version the parent/system loader provides must be the right version for all webapps you configure in this way.

这正是您所描述的情况。一个 MySingleton 实例正在由主 Java 程序加载,另一个正在由 Jetty 的类加载器加载。

关于java - 单例并不是真正的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com