0

当与客户端提供的 Map 一起使用时,下面的类似乎卡在方法 lrPoints 中。到目前为止的结论是,要么 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”方法返回正常。此映射是否正确构建以防止客户端锁定?这种方法可能失败还有其他原因吗?

编辑。添加更多日志记录并更改为 TreeMap 之后。我现在看到的问题是静态构造方法 Pair.of(.,.)。这种静态初始化程序是否有可能导致死锁?

4

0 回答 0