有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我认为所有这些都是伴随着^{}

        private Map<String, Result> sqlRepository = new ConcurrentHashMap<>();
    
        public Result getResult(String key) {
            return sqlRepository.computeIfAbsent(key, this::doAnExpensiveOperation);
        }