【发布时间】:2020-02-29 13:23:07
【问题描述】:
我分析了jdk1.8中的代码,但在其他jdk版本中可能有同样的问题
-
让我们假设以下代码中的 party = 3
CyclicBarrier cb = new CyclicBarrier(3);
parties = 3 and count > = 0,所以getNumberWaiting()的返回值 但在某些特定情况下,超过 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() = (循环数) * 参与方 - 计数
【问题讨论】:
-
不要将代码粘贴为图像。它使得无法复制/粘贴以进行测试,并且由于它是文本,因此不需要是图像(我相信您可以想出一个与红色大箭头不同的指示器来显示错误所在)。
-
您是否遇到错误,或者您是否声称存在基于对自 1.5 以来 JDK 中的类的眼睛分析的错误?
-
这是一个基于眼睛分析的bug讨论,我只是想收集支持者
-
@Kayaman 这个问题只是讨论和眼睛分析,所以我认为粘贴代码作为图像是合适的
-
那么这不是错误。除非你能展示导致错误行为的代码,否则只是你不理解它为什么起作用。
标签: java java.util.concurrent cyclicbarrier