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

时间:2018-01-31 01:34:04

标签: java multithreading servlets concurrency

在Java 7 Tomcat应用程序中,包含多个简单(字符串和数字)类型的对象/结构 obj 经常由多个servlet线程共享(读取)。定期(每n分钟),所有 obj 的成员需要同时相互刷新,并且每个servlet线程必须始终在读取对象时获得更新的值。如果没有连接客户端,则无需刷新值;但是一旦连接(假设自上次更新至少已经过了n分钟),更新需要在之前读取对象。 更新:我应该提一下,目前, obj 的成员之一是一个时间戳,表明对象数据何时到期并需要刷新。如果解决方案(如下面的评论中提到的Guava Cache)已经内置了此功能,那么就更好了。

您将如何在Java 7中实现此功能?在这一点上,简单性和“清洁度”比性能更重要,但如果您还想提供针对性能优化的解决方案,请执行此操作。我有一个想法可能会或可能不会像我期望的那样工作,但我想首先听取其他意见。提前谢谢。

1 个答案:

答案 0 :(得分:1)

使用Guava缓存。

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

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);

然后通过获取&#34; myCache&#34;来自上下文对象的属性。