Записи Java ConcurrentSkipListMap заблокированы при навигации

Приведенный ниже класс, кажется, застрял в методе 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(.,.). Есть ли причина, по которой такой статический инициализатор может вызвать тупик?

0 ответов

Другие вопросы по тегам