java构建同步映射,在单个键上阻塞
我想构建一个存储库类,如下所示:
public class ResultRepository {
private Map<String, Result> sqlRepository = Collections.synchronizedMap(new HashMap<>());
public synchronized Result getResult(String key) {
Result result = map.get(key);
if (result == null) {
result = doAnExpensiveOperation(key));
map.put(key, result);
}
return result;
}
...
}
目前,这将起作用,但如果需要昂贵的操作,那么如果对getResult
方法进行多次调用,则速度会很慢
然而,我想要的是:
- 检索不同键的结果是非阻塞的
- 如果已创建特定密钥的结果,则会立即返回该结果
- 如果尚未创建特定密钥的结果,则会生成该结果(通过昂贵的操作)
- 如果特定键的结果尚未创建,但正在单独的线程中生成,则该线程将等待,直到创建结果,然后返回该结果李>
有没有一种模式可以让我得到这种行为?理论上,我可以拥有Set
个挂起的结果键,但这似乎有点令人讨厌。也许存储库可以保存Future<Result>
个对象
# 1 楼答案
我认为所有这些都是伴随着^{}