0

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

  1. 让我们假设以下代码中的当事方 = 3

    CyclicBarrier cb = 新的 CyclicBarrier(3);

在此处输入图像描述

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

在此处输入图像描述

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

b) 线程A执行lock.unlock()后,位置1的线程B得到锁(但锁不公平),所以现在index = 2,count =2,它会在位置3等待,所以现在有3线程在位置 3等待

c) 假设,锁总是由位置1的线程获得,所以等待线程的数量会越来越多

所以getNumberWaiting() > 3是结果

getNumberWaiting() = (循环数) * 各方 - 计数

4

1 回答 1

1

我认为您需要多看一下“世代”的概念。在您的场景中,线程 A 将调用nextGeneration()重置所有计数 (getNumberWaiting() = 0) 并向所有当前服务员发出信号。那些服务员(现在的上一代)将很快开始完成。

所以是的,可能有超过 3 个线程反对tripCondition 但 2 x 旧服务员已发出信号离开,并且任何新服务员都在等待新信号。getNumberWaiting不是使用计算的,Lock.getHoldCount()所以这没关系。

于 2019-11-04T10:24:11.910 回答