【发布时间】:2015-07-10 10:28:55
【问题描述】:
我不得不涉足缓存和多线程(每个请求线程),而且我是该领域的绝对初学者,所以任何帮助将不胜感激
我的要求是:
- 缓存一个具有以太间隔刷新或用户刷新的单个大对象
- 由于检索对象数据非常耗时,因此使其成为线程安全的
- 检索对象数据时返回“旧数据”,直到有新数据可用
- 优化
在 SO 和其他一些用户的帮助下,我有了这台 ATM:
** 根据 Sandeep 和 Kayaman 的建议编辑 **
public enum MyClass
{
INSTANCE;
// caching field
private CachedObject cached = null;
private AtomicLong lastVisistToDB = new AtomicLong();
private long refreshInterval = 1000 * 60 * 5;
private CachedObject createCachedObject()
{
return new CachedObject();
}
public CachedObject getCachedObject()
{
if( ( System.currentTimeMillis() - this.lastVisistToDB.get() ) > this.refreshInterval)
{
synchronized( this.cached )
{
if( ( System.currentTimeMillis() - this.lastVisistToDB.get() ) > this.refreshInterval)
{
this.refreshCachedObject();
}
}
}
return this.cached;
}
public void refreshCachedObject()
{
// This is to prevent threads waiting on synchronized from re-refreshing the object
this.lastVisistToDB.set(System.currentTimeMillis());
new Thread()
{
public void run()
{
createCachedObject();
// Update the actual refresh time
lastVisistToDB.set(System.currentTimeMillis());
}
}.start();
}
}
在我看来,我的代码满足了上述所有书面要求。 (但我不确定)
随着代码很快进入第三方分析,我非常感谢任何关于代码性能和盲点的意见
感谢您的帮助。
编辑:VanOekel 的答案是解决方案,因为我的代码(根据 Sandeep 和 Kayaman 的建议编辑)没有考虑用户触发的 refresh() 在这个多线程环境中的影响
【问题讨论】:
-
抱歉,这听起来很迂腐,但拼写为“caching”和“cache”。虽然从 java 代码中获得旧钱的想法让我很开心:)
-
@Dragondraikk 我很抱歉拼写错误,我在缓存方面太新了,我什至无法拼写它...我已修复它:)
-
除非你要去裸体度假村,否则你可能还想避免说
bare with me..
标签: java multithreading performance