如何同步来自 Java 中不同对象的相等键

How to synchronize on equal keys from different objects in Java

方法calculate在不同的线程上执行了多次。然后将其结果保存到 HashMap 中。类似的东西:

void execute(){
     ...
     map.put(key, calculate(key);
}

Data calculate(Key key){
     ...
}

我想防止对同一个键的多次执行,但我不想阻塞所有线程。理想的解决方案是同步 calculate 而不是 Key。问题是 Key 不是最终的,我可以比较键并检查它们是否相等,但它们将是不同的对象。

我该如何解决这个问题?

看起来你可以使用 ConcurrentMap implementation (such as ConcurrentHashMap), and let computeIfAbsent 来完成繁重的工作:

map.computeIfAbsent(key, k -> calculate(k));

根据文档,computeIfAbsent 可能是乐观的。如果你需要一个悲观的解决方案,你可以使用条带锁。因此,您创建了一个可以锁定的对象数组和找到锁的密钥的哈希值。

private final Object[] locks = ....

synchronized(lock(key)){
    ...
}

Object lock(Object key){
      return locks[hashToIndex(key.hashcode())]
}