我可以在servlet中使用单例在不同会话之间共享信息。
我知道任何时候只有一个实例Servlet在运行。为每个传入请求调用服务方法。但是如何创建另一个Singleton类(例如:ShareSingleton),它在servlet的Init()方法中调用它的getInstance()。此ShareSingleton可以携带需要在会话/请求之间共享的数据。
在servlet中使用这种方法有风险吗?
答案 0 :(得分:9)
首先......看看这是单身人士的最佳方法:http://javarevisited.blogspot.com/2012/07/why-enum-singleton-are-better-in-java.html
第二:记住单身人士只是JVM的单身人士。所以..如果你有多个JVM在运行,那么不要指望每个单例具有相同的状态。
第三:为了安全起见,我将从servlet上下文的监听器中实例化单例。
请参阅http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html
在web.xml中定义一个类并在那里实例化它。您的单例将在您的webapp启动时创建,而不是当n人立刻点击您的servlet的服务方法时。
答案 1 :(得分:0)
是的,你可以。请注意,servlet容器可能使用Servlet对象的多个实例,因此您必须确保在所有这些实例之间共享一个对象。
例如,您可以这样做:
private static final Cache<String,String> = //cache
然后使用缓存中的值(如果可用),或者使用新计算的值更新缓存。请注意,共享的对象必须是线程安全的。