- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是建议的解决方案(我确实搜索了相同的解决方案 - 没有成功)
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/
这是建议的解决方案(我确实搜索了相同的解决方案 - 没有成功) public abstract class AsyncCache { /** * an ato
在挖掘一些旧的源代码时,我看到了以下内容: my $module = $some{module}; eval "require $module"; die "Bad module\n$@" if $@
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 3年前关闭。 锁定。这个问题及其答案是loc
我设计了以下方法来捕获整个AS3应用程序中的错误: 在Document类中,定义以下方法: //This is the handler for listening for errors protect
我想知道是否有人看到任何可能导致此代码出现问题的内容。我知道我可以使用其他方法/API 调用来完成此操作,但我正在尝试为我自己的平台独立性奠定基础?/跨平台互斥框架。 显然我需要做一些#ifdef 并
我一直在阅读大量有关实现响应式移动下拉菜单的不同方法的资料。纯 CSS 解决方案对我来说似乎有点笨拙,但我讨厌依赖 javascript 来处理像导航菜单这样重要的事情。我想到的是使用 javascr
我即将构建我的第一个基于 Lisp 的严肃项目:一个需要扩展到数以万计的用户(不是同时的 - 最多可能是数百个同时)的 Web 应用程序。 我打算使用的堆栈如下所示: Weblocks具有 Berke
我正在寻找 PerlCritic 的等价物对于 PHP。 PerlCritc 是一个静态源代码分析器,它对代码进行 qritiques,并就从未使用的变量到处理数据的不安全方式到几乎所有内容的所有内容
我正在编写一个 perl 脚本,该脚本需要在调用外部程序之前设置许多环境变量。我的代码有形式 $ENV{'VAR1'} = "value1"; $ENV{'VAR2'} = "value2
我是一名优秀的程序员,十分优秀!