ConcurrentSkipListSet,add方法在Java 8中失败

时间:2014-11-29 02:48:38

标签: java multithreading java.util.concurrent

等待 ConcurrentSkipListSet 得到修复(http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8060435),我的大脑无法尝试解决问题。

其他人在Java 8中遇到过问题吗? add方法在Java 7中运行良好,但是它打破了Java 8并导致了对我的音频引擎的事件系统的重大破坏。

我正在考虑尝试编写替代方案。重要的是发生绝对最小的阻塞。 (我试图避免使用同步。)

添加的是“AudioEvents”(我创建的类)按帧号排序(长)。在一个线程上发生添加,并且在音频线程上发生对该集合的引用。

这样的东西不应该在版本之间中断。

2 个答案:

答案 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;

[在这里尴尬的图标。]