Servlet中的单例

时间:2013-11-20 08:11:41

标签: java servlets singleton

我可以在servlet中使用单例在不同会话之间共享信息。

我知道任何时候只有一个实例Servlet在运行。为每个传入请求调用服务方法。但是如何创建另一个Singleton类(例如:ShareSingleton),它在servlet的Init()方法中调用它的getInstance()。此ShareSingleton可以携带需要在会话/请求之间共享的数据。

在servlet中使用这种方法有风险吗?

2 个答案:

答案 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

然后使用缓存中的值(如果可用),或者使用新计算的值更新缓存。请注意,共享的对象必须是线程安全的。