Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ConcurrentSkipListSet,添加方法在Java 8中失败_Java_Multithreading_Java.util.concurrent - Fatal编程技术网

ConcurrentSkipListSet,添加方法在Java 8中失败

ConcurrentSkipListSet,添加方法在Java 8中失败,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,待ConcurrentSkipListSet得到修复(),我的大脑无法找到解决方法 其他人在Java8中有问题吗?add方法在Java7中工作得很好,但在Java8中出现了问题,并导致我的音频引擎的事件系统出现了严重的问题 我正在考虑制定一个替代方案。发生阻塞的绝对最小值很重要。(我试图避免使用同步。) 添加的是“AudioEvents”(我创建的一个类),按帧编号(长)排序。添加发生在一个线程上,对集合的引用发生在音频线程上 像这样的东西不应该在不同版本之间中断。你可以使用OpenJDK 7中

待ConcurrentSkipListSet得到修复(),我的大脑无法找到解决方法

其他人在Java8中有问题吗?add方法在Java7中工作得很好,但在Java8中出现了问题,并导致我的音频引擎的事件系统出现了严重的问题

我正在考虑制定一个替代方案。发生阻塞的绝对最小值很重要。(我试图避免使用同步。)

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


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

你可以使用OpenJDK 7中ConcurrentSkipListSet的源代码,如果你没有或懒得下载,可以在GrepCode或DocJar上找到它。

我回答我自己的问题,而不是删除这个问题,因为如果ConcurrentSkipListSet出现问题,这些信息可能会对其他人有用

我的错误被证明是Comparable的一个写得很差的实现。JavaDoc中列出了一些应该强制执行的需求,我对此很粗心

当在Java8中修改ConcurrentSkipListSet的实现时,比较中的漏洞导致了无限旋转

可变帧是一个长帧

@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;
}
@覆盖
公共int比较(音频事件其他)
{
if(frameother.getFrame())返回1;
//下面是此处的比较错误
//如果(frame>=other.getFrame())返回1;
返回0;
}
所以,提醒一下。很容易错误地得出关于系统代码的结论,这些结论相对来说是神秘的(对我来说,ConcurrentSkipListSet在这方面是合格的!)。人们应该首先强烈检查自己编写的与这些“神秘事物”交互的代码


[这里的尴尬图标。]

为您提供后续信息:我的第一个尝试是使用Java7或Java8的OpenJDK ConcurrentSkipListSet的整个源代码,但失败了。查看源代码当然很有趣,但它与其他代码的关系太深,并且(对我来说)抛出了一些神秘的不安全相关错误。我还没有试着解决重写问题,我怀疑编码会让我不知所措。但这是一个很好的参考。我会再研究一下,看看我能不能弄明白。啊-是的,不安全。我在过去使用过它,您不能使用单例,因为它非常不稳定,它由类装入器检查来保护。这里有一篇关于这个主题的精彩文章:很棒的文章!与此同时,我发现了我的错误,这一特殊的“危机”已经解决。谢谢一些对并发感兴趣的人正在看一看。这似乎与我在上面找到并提到的bug报告不同。当我们弄清楚这一点的时候,我会发布一个解决方案。那就是我们应该宣传单元测试的时候了。特别是对于具有适用于所有实现的契约的接口,如
Comparable
,编写测试代码检查所有这些不变量是很容易的。如果有这样一个测试代码告诉你你的代码失败了(没有涉及到
ConcurrentSkipListSet
),那么你节省了很多时间,可能比编写测试用例所需的时间要多得多。单元测试的主要候选者,特别是因为需求在JavaDoc中是如此清晰地发布——进行相应的测试是很容易的。嘿,谢谢Phil。这救了我。我花了几乎一整天的时间跟踪一个不一致的Windows特定应用程序冻结,但至少现在它已经解决了。