Java 7:在 ServletContextListener 中实现线程安全可修改静态对象的最佳方法?



在Java 7 Tomcat应用程序中,包含几个简单(字符串和数字)类型的对象/结构obj经常被多个servlet线程共享(读取)。定期(每 n 分钟),obj的所有成员都需要同时以原子方式相互刷新,并且每个 servlet 线程在读取对象时必须始终获取更新的值。如果未连接客户端,则无需刷新值;但是一旦连接(假设自上次更新以来至少已经过去了 N 分钟),更新需要在读取对象之前进行。更新:我应该提到,目前,obj的一个成员是一个时间戳,指示对象数据何时过期并需要刷新。如果解决方案(例如下面评论中建议的番石榴缓存)已经内置了此功能,那就更好了。

您将如何在Java 7中实现这一点?在这一点上,简单性和"清洁度"比性能更重要,但如果您还想提供针对性能进行优化的解决方案,请这样做。我有一个想法,可能会也可能不会按照我预期的方式工作,但想先听听其他意见。提前谢谢。

使用番石榴缓存。

在上下文侦听器中,执行以下操作:

LoadingCache<String, List<YourObjectType>> myCache = CacheBuilder.newBuilder()
.expireAfterWrite(60, TimeUnit.MINUTES)
.build(new CacheLoader<String, List<YourObjecttype>>() {
public List<YourObjectType> load(String arg) {
...
}
});

将其保存到您的 servlet 上下文中:

ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.setAttribute("myCache", myCache);

然后通过从上下文对象获取"myCache"属性在任何地方使用它。

最新更新