等待 ConcurrentSkipListSet 得到修复(http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8060435),我的大脑无法尝试解决问题。
其他人在Java 8中遇到过问题吗? add方法在Java 7中运行良好,但是它打破了Java 8并导致了对我的音频引擎的事件系统的重大破坏。
我正在考虑尝试编写替代方案。重要的是发生绝对最小的阻塞。 (我试图避免使用同步。)
添加的是“AudioEvents”(我创建的类)按帧号排序(长)。在一个线程上发生添加,并且在音频线程上发生对该集合的引用。
这样的东西不应该在版本之间中断。
答案 0 :(得分:1)
你可以做的是在OpenJDK 7中使用ConcurrentSkipListSet的源代码,如果你没有或者懒得下载,可以在GrepCode或DocJar上使用。
答案 1 :(得分:1)
我正在回答我自己的问题,而不是删除这个问题,因为如果出现ConcurrentSkipListSet问题,这些信息可能会对其他人有用。
我的错误证明是Comparable的写得不好。 JavaDoc中列出了应该强制执行的要求,我不在乎。
当在Java 8中修改ConcurrentSkipListSet的实现时,我的比较中的漏洞导致无限旋转。
变量 frame 是一个很长的。
@Override
public int compareTo(AudioEvent other)
{
if (frame < other.getFrame()) return -1;
// correct
if (frame > other.getFrame()) return 1;
// following is the compare error that WAS here
// if (frame >= other.getFrame()) return 1;
return 0;
}
所以,提醒一下。很容易错误地跳到关于相对神秘的系统代码的结论(并且ConcurrentSkipListSet对我来说是合格的!)。首先应该强烈检查一个人写的与这些神秘事物相互作用的代码。&#34;
[在这里尴尬的图标。]