gpt4 book ai didi

java - AOP+同步

转载 作者:行者123 更新时间:2023-12-02 06:33:29 29 4
gpt4 key购买 nike

我不太确定如何解决这个问题......所以我可能需要几次尝试才能正确回答这个问题。我有一个用于缓存方法结果的注释。我的代码目前是一个私有(private)分支,但我正在处理的部分从这里开始: https://code.google.com/p/cache4guice/source/browse/trunk/src/org/cache4guice/aop/CacheInterceptor.java#46

我已经注释了一个我想要缓存的方法,它运行一个非常慢的查询,有时需要几分钟才能运行。问题是,我的异步网络应用程序不断吸引新用户前来并请求相同的数据。但是,getSlowData() 方法尚未完成。

所以像这样:

@Cached
public getSlowData() {
...
}

在拦截器内部,我们检查缓存并发现它没有被缓存,这将我们传递给:

return getResultAndCache(methodInvocation, cacheKey);

我从来没有对并发的整个概念感到满意。我认为我需要的是标记给定 getSlowData() 的 getResultAndCache() 方法已经启动,后续请求应该等待结果。

感谢您的任何想法或建议!

最佳答案

大多数缓存实现都会同步对“get”和“set”的调用,但这只是等式的一半。您真正需要做的是确保只有一个线程进入“检查是否已加载,如果不存在则加载”部分。对于大多数情况,如果存在

,序列化线程访问的成本可能不值得
 1) no risk 
2) little cost

通过并行线程多次加载数据(如果您需要对此进行更多说明,请在此处发表评论)。由于此注释被普遍使用,我建议创建第二个注释,例如“@ThreadSafeCached”,并且调用方法将如下所示

    Object cacheElement = cache.get(cacheKey);
if (cacheElement != null) {
LOG.debug("Returning element in cache: {}", cacheElement);
} else {
synchronized(<something>) {
// double-check locking, works in Java SE 5 and newer
if ((cacheElement = cache.get(cacheKey)) == null) {
// a second check to make sure a previous thread didn't load it
cacheElement = getResultAndCache(methodInvocation, cacheKey);
} else {
LOG.debug("Returning element in cache: {}", cacheElement);
}
}
}
return cacheElement;

现在,我留下了关于同步内容的部分。最好锁定正在缓存的项目,因为您不会让任何未专门加载此缓存项目的线程等待。如果这是不可能的,另一种粗略的方法可能是锁定注释类本身。这显然效率较低,但如果您无法控制缓存加载逻辑(看起来像您一样),那么这是一个简单的方法!

关于java - AOP+同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19877383/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com