Мне нужна реализация карты , которая поддерживает параллелизм и сохраняет только наименьшую/большую добавленную стоимость (в зависимости от компаратора). Будет ли работать следующий код?Скользящая карта с наименьшим значением
class LeastValConcurrentMap<K, V> {
//put the least value
private final Comparator<V> comparator;
private final ConcurrentHashMap<K, V> map = new ConcurrentHashMap<K, V>();
LeastValConcurrentMap(Comparator comparator) {
this.comparator = comparator;
}
public void put(K k, V v) {
V vOld = map.put(k, v);
if (vOld == null || comparator.compare(v, vOld) <= 0) //i.e. v <= vOld so better
return;
//recursively call self
put(k, vOld);
}
@Override
public String toString() {
return map.toString();
}
}
Не могли бы вы привести пример того, где/почему это не сработает? Есть ли что-то в guava или стандартной java-библиотеке, которую я мог бы использовать?
Я считаю, что вы хотите V VOLD = map.get (k, v); –
вам необходимо синхронизировать метод LeastValConcurrentMap.put (K k, V v), поскольку ConcurrentHashMap может быть потокобезопасным, но ваш метод не является. –
У вас есть состояние гонки. Рассмотрим, что происходит, когда два потока одновременно вводят один и тот же ключ. т.е. они оба запускают put() –