CyclicBarrier.getNumberWaiting()是否正确?

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

  1. 让我们假设以下代码中的 parties = 3

    cyclicBarrier cb =新的cyclicBarrier(3);

CyclicBarrier.getNumberWaiting()是否正确?

parties = 3并且count> = 0,所以返回值 getNumberWaiting() 但在某些情况下,超过3个线程 2.让我们看看cyclicBarrier中的关键代码

CyclicBarrier.getNumberWaiting()是否正确?

a)位置2的线程A将返回0,现在有2个线程在位置3等待

b)在线程A执行lock.unlock()之后,位置1的线程B获得了该锁(但是该锁不公平),所以现在index = 2,count = 2,它将在位置3等待,所以现在在位置3中有 3个线程在等待

c)假设,锁定总是由位置1处的线程获得,因此等待线程的数量将越来越多

所以 getNumberWaiting()> 3 是结果

getNumberWaiting()= (循环号)*参与者-计数

liuliangkb1984 回答:CyclicBarrier.getNumberWaiting()是否正确?

我认为您需要多考虑“一代”概念。在您的情况下,线程A将调用nextGeneration(),它将重置所有计数(getNumberWaiting()= 0)并向所有 current 服务员发出信号。这些服务员(现在是上一代)将很快开始工作。

是的,在trip条件下可能有3个以上的线程,但是已经通知2个旧的服务员要离开,任何新的服务员都在等待新的信号。 getNumberWaiting不是使用Lock.getHoldCount()计算的,所以可以。

本文链接:https://www.f2er.com/3168128.html

大家都在问