我分析了jdk1.8中的代码,但在其他jdk版本中可能有相同的问题
让我们假设以下代码中的parties = 3
[CyclicBarrier cb =新的CyclicBarrier(3);
parties = 3 and count> = 0,所以返回值getNumberWaiting()<= 3但在某些情况下,超过3个线程将等待2.让我们看看CyclicBarrier中的关键代码
a)位置2的线程A将返回0,现在有2个线程在位置3等待
b)在线程A执行lock.unlock()之后,位置1的线程B获得了该锁(但是该锁是不公平的),所以现在index = 2,count = 2,它将在位置3等待,所以现在是3个线程等待中在位置3
c)假设,锁定总是由位置1的线程获得,因此等待线程的数量将越来越多
所以getNumberWaiting()> 3是结果
getNumberWaiting()= (循环数)*参与者-计数
[我认为您需要多看看“世代”概念。在您的方案中,线程A将调用nextGeneration()
,它将重置所有计数(getNumberWaiting()= 0)并向所有current服务员发出信号。这些服务员(现在是上一代)将很快开始工作。
所以是的,在trip
条件下可能有3个以上的线程,但是已经通知2个旧的服务员要离开,任何新的服务员都在等待新的信号。没有使用getNumberWaiting
来计算Lock.getHoldCount()
,所以可以。