我正在java.util.concurrent.ConcurrentSkipListSet
用比较器创建一个。我的比较器比较对象中的 Instant 字段以确定顺序。这是比较器:
public int compare(myObj first, myObj second) {
if (first == null || first.getTime() == null) {
return 1;
}
if (second == null || second.getTime() == null) {
return -1;
}
if ( first.getTime().isBefore(second.getTime()) {
return -1;
}
else {
return 1;
}
}
当我使用上述比较器 5/10 次时,它陷入了无限循环。First 总是在 second 之后,所以程序总是到达 else 并返回 1,但是在某些运行中它只是循环,它到达 else 但只是卡在不断运行比较器......我在调试模式下运行时可以看到这一点以及添加额外日志记录时。为了澄清这两个对象在卡住时是不一样的,所以问题不在于尝试添加重复项。当我像这样切换 isBefore 到 isAfter 时,我没有得到那种行为,它每次都按预期运行。我的问题是为什么会发生这种情况?
public int compare(myObj first, myObj second) {
if (first == null || first.getTime() == null) {
return 1;
}
if (second == null || second.getTime() == null) {
return -1;
}
if ( first.getTime().isAfter(second.getTime()) {
return 1;
}
else {
return -1;
}
}
添加到列表实现(为简单起见)
我的并发跳过集逻辑非常简单,我使用上面的比较器创建集合,然后 myObj 瞬间启动到 now() + 预定的分钟数(硬编码所以这个计算不会失败)然后我的 obj 被添加到并发跳过集
private ConcurrentSkipListSet<MyObj> skipSetImpl= new ConcurrentSkipListSet<>(new MyObj.MyobjComp());
// added in a method, using Java Instant
foo.setTime( now.plus(60, ChronoUnit.SECONDS) );
this.skipSetImpl.add(foo); // add to concurrentSkipSet