当与客户端提供的 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(.,.)。这种静态初始化程序是否有可能导致死锁?