我已经实现了一个简单的Cyclic Barrier,但是通过快速测试,我已经意识到如果你为2个线程设置了一个屏障,但是有4个线程即将到达barrier.await()那么你将得到2个实例同时在临界区中的线程对。类似地,使用6个线程可以同时在关键部分获得3对线程(由于我不熟悉,因此测试得不是很好)
我的问题是,如果n个线程通过屏障并进入临界区,当关键部分已被使用时,如何阻止其他n个线程组进入临界区?
提前致谢。
答案 0 :(得分:1)
在第n个线程到达后,所有n将立即被允许越过障碍并争夺临界区。 (n + 1)'th to(2n-1)'将再次等待直到第2个线程到达屏障,一旦到达,所有(n + 1)'到2n'将一起穿过屏障并且争夺关键部分。 您可以将AtomicInteger初始化为0,并在每次临界区之前将其递增。还检查其值是否为n,然后阻止/退出/返回所有其他线程。
顺便说一下,只有AtomicInteger增量并且检查它已经变成n,就足够了,对于n个线程是允许的,并且剩下要拒绝,如果使用的话,Cyclic Barrier将在这里做什么,将导致所有前n个线程争用关键部分在一起。 (如果只有一个线程应该执行代码部分,那么只调用它的关键部分或者称之为“n thread allowed region”) 就像等待在餐桌上吃饭的人在至少n个人之前不允许吃饭一样,并且一旦有n个人,所有人都允许一起跳到晚餐上:)