CyclicBarrier.getNumberWaiting()是否准确?

问题描述 投票:-1回答:1

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

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

    [CyclicBarrier cb =新的CyclicBarrier(3);

enter image description here

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

enter image description here

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

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

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

所以getNumberWaiting()> 3是结果

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

java java.util.concurrent cyclicbarrier
1个回答
0
投票

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

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.