Записи Java ConcurrentSkipListMap заблокированы при навигации - PullRequest
0 голосов
/ 13 мая 2018

Приведенный ниже класс, похоже, застрял в методе lrPoints, когда используется с Map, предоставленной клиентом.На данный момент делается вывод, что либо lrPoint выполняет бесконечный цикл, либо существует тупик.Я не могу воспроизвести ошибку, но могу убедиться, прочитав журналы, что метод lrPoints никогда не завершается.

import java.util.Map;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
import org.apache.commons.lang3.tuple.Pair;
import org.joda.time.LocalDateTime;

public final class TimeSeries {

    private final NavigableMap<LocalDateTime, Double> series = new ConcurrentSkipListMap<>();

    public TimeSeries(Map<LocalDateTime, Double> m) {
        series.putAll(m);
    }

    public Double get(LocalDateTime t){
        return series.get(t);
    }

    public Pair<Entry<LocalDateTime, Double>, Entry<LocalDateTime, Double>> lrPoints(LocalDateTime t) {
        if (series.isEmpty() || t.isBefore(series.firstKey()) || t.isAfter(series.lastKey()))
            throw new IllegalArgumentException("t outside of time series bounds");
        Entry<LocalDateTime, Double> l = series.floorEntry(t);
        Entry<LocalDateTime, Double> r = series.ceilingEntry(t);
        return Pair.of(l,r);
    }
}

В добавление к проблеме метод get возвращает ok.Правильно ли построена эта карта для предотвращения блокировки клиента?Есть ли какая-либо другая причина, по которой этот метод мог не работать?

ПравкаПосле добавления еще регистрации и изменения в TreeMap.Теперь я вижу, что проблема в методе статического конструктора Pair.of (.,.).Есть ли причина, по которой такой статический инициализатор может вызвать тупик?

...