0

我已经实现了一个简单的循环障碍,但从快速测试中我意识到,如果你为 2 个线程设置障碍,但有 4 个线程即将到达 barrier.await(),那么你将获得 2 个线程对实例同时在临界区。同样,使用 6 个线程将同时在关键部分获得 3 对线程(由于我是新手,所以没有很好地测试)

我的问题是,如果 n 个线程通过障碍并进入临界区,如何在临界区已在使用时阻止其他 n 个线程组进入临界区?

提前致谢。

4

1 回答 1

1

在第 n 个线程到达后,所有 n 将立即被允许越过屏障并竞争临界区。(n+1)'th 到 (2n-1)'th 将再次等待直到第 2n'th 线程到达屏障,一旦到达,所有 (n+1)' th 到 2n' th 将一起穿过屏障并且争夺临界区。您可以将 AtomicInteger 初始化为 0,并在您的关键部分之前每次递增它。还要检查它的值是否变为 n,然后阻止/退出/返回所有其他线程。

顺便说一句,只有 AtomicInteger 递增并检查它是否已变为 n,就足够了,允许 n 个线程,并保留拒绝,如果使用 Cyclic Barrier 将在这里做的是,将导致所有第一个 n 线程一起竞争临界区. (如果只有一个线程应该执行代码部分,那么只称它为临界区,或者称它为“n 线程允许区域”)就像如果人们在餐桌上等着吃饭的人在至少有 n 人之前不允许吃饭,一旦有 n 人,所有人都可以一起跳进晚餐 :)

于 2018-06-07T14:35:04.980 回答