gpt4 book ai didi

java - 寻求资源异步重建的建议/批评

转载 作者:太空宇宙 更新时间:2023-11-04 08:29:28 26 4
gpt4 key购买 nike

这是建议的解决方案(我确实搜索了相同的解决方案 - 没有成功)

    public abstract class AsyncCache<T> {

/**
* an atomic int is used here only because stamped reference doesn't take a long,
* if it did the current thread could be used for the stamp.
*/
private AtomicInteger threadStamp = new AtomicInteger(1);
private AtomicStampedReference<T> reference = new AtomicStampedReference<T>(null, 0);

protected abstract T rebuild();

public void reset() {
reference.set(null, 0);
}

public T get() {
T obj = reference.getReference();
if (obj != null) return obj;

int threadID = threadStamp.incrementAndGet();

reference.compareAndSet(null, null, 0, threadID);

obj = rebuild();

reference.compareAndSet(null, obj, threadID, threadID);

return obj;

}

}

该过程应该很容易看到 - 资源仅在请求时构建,并通过调用重置使其失效。

第一个请求资源的线程将其 ID 插入到标记引用中,然后一旦生成,就会插入其资源版本,除非调用另一个重置。如果发生后续重置,第一个请求线程将返回资源的过时版本(是有效的用例),并且在最近重置后启动的某些请求将使用其结果填充引用。

如果我错过了一些东西或者是否有更好的(更快+更简单++优雅)解决方案,请告诉我。有一件事 - MAX_INT 不是故意处理的 - 不相信编会活得足够长,但肯定很容易做到。

谢谢。

最佳答案

这显然不是异步的,因为请求线程将阻塞,直到重建()方法完成为止。另一个问题 - 您不检查从compareAndSet返回的值。我相信你需要这样的东西

if(reference.compareAndSet(null, null, 0, threadID)) { //if resource was already reseted - rebuild
reference.compareAndSet(null, obj, threadID, threadID);
obj = rebuild();
}

但是这种方法还有另一个缺点 - 您必须多次重建条目(考虑到多个线程同时需要该条目)。您可以针对这种情况使用 future 任务(http://www.codercorp.com/blog/java/simple-concurrent-in-memory-cache-for-web-application-using-future.html)或使用 MapMaker .

关于java - 寻求资源异步重建的建议/批评,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814031/

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