如何同步来自 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())]
}
方法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())]
}