Java CyclicBarrier.getNumberWaiting()准确吗?

Java CyclicBarrier.getNumberWaiting()准确吗?,java,java.util.concurrent,cyclicbarrier,Java,Java.util.concurrent,Cyclicbarrier,我分析了jdk1.8中的代码,但在其他jdk版本中可能存在相同的问题 让我们假设以下代码中的参与方=3 CyclicBarrier cb=新的CyclicBarrier(3) parties=3,count>=0,因此结果是getNumberWaiting()3的返回值 getNumberWaiting()=(循环数)*parties-count我认为您需要进一步了解“生成”概念。在您的场景中,线程A将调用nextGeneration(),这将重置所有计数(getNumberWaiting()

我分析了jdk1.8中的代码,但在其他jdk版本中可能存在相同的问题

  • 让我们假设以下代码中的参与方=3

    CyclicBarrier cb=新的CyclicBarrier(3)

  • parties=3,count>=0,因此结果是getNumberWaiting()3的返回值


    getNumberWaiting()=(循环数)*parties-count

    我认为您需要进一步了解“生成”概念。在您的场景中,线程A将调用
    nextGeneration()
    ,这将重置所有计数(getNumberWaiting()=0)并向所有当前等待者发出信号。那些侍者(现在是上一代)很快就会开始完成


    因此,是的,可能有超过3个线程反对
    trip
    条件,但2 x老服务员已被信号通知离开,任何新服务员正在等待新的信号。
    getNumberWaiting
    不是使用
    Lock.getHoldCount()
    计算的,所以这是可以的。

    不要将代码粘贴为图像。它使复制/粘贴测试变得不可能,而且因为它是文本,所以不需要是图像(我相信你可以想出一个不同于红色大箭头的指示器来显示错误所在)。你是否遇到错误,或者你是在声称JDK中的一个类从1.5开始就存在基于眼睛分析的错误?这是一个基于眼睛分析的错误讨论,我只想收集supporters@Kayaman这个问题只是讨论和眼睛分析,所以我认为将代码粘贴为图像是合适的,那么它就不是bug了。除非您可以显示导致错误行为的代码,否则问题只是您不理解它为什么工作。nextGeneration()将调用trip.signalAll(),但此方法无法使线程在获得锁之前离开,但我们可以假设锁将始终在位置1被抓取,因此,等待的线程将累积在位置3,只有执行LockSupport.unpark()的线程才能继续,否则它将始终被阻塞在位置3,trip.signalAll()无法解析线程确实“老服务员”可能需要等待新服务员睡觉才能竞争,但这只是描述锁的公平性。你说的还是我的答案。内部锁上的等待线程数可以大于3,但是
    CyclicBarriers
    契约保持不变,因为它们属于不同的代。那么您的意思是getNumberWaiting()=GetNumberWaititfcurrentGeneration(),getTotalNumberWaiting()=所有正在等待的线程吗?正是这样。我认为你不应该提交jdk bug!