当前位置: 首页 > 知识库问答 >
问题:

当通过它的线程数量小于屏障限制时,屏障(例如CyclicBarrier)是否会导致死锁?

胡高寒
2023-03-14
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class MainDeadlock {
  public static void main(String[] args) throws InterruptedException {
    final CyclicBarrier c = new CyclicBarrier(3); 
    Runnable r = () -> {
            try {
                c.await();
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println("Run!");
    };
    new Thread(r).start();
    new Thread(r).start();
}

我很困惑他们是如何“互相等待”的,

提问:“互相等待”是否暗含循环等待?如果是,怎么做?严格来说,这是一个僵局的局面吗?

共有1个答案

东方乐
2023-03-14

您可以认为cyclicbarrier根本不了解线程。这样想吧:

  1. 屏障维护对Await()的调用。
  2. 调用await()时,代码会阻塞(方法不会返回),但屏障会增加其总价值。
  3. 当计数值达到构造时给定的party值时,将重置计数值,并释放在调用await()时阻塞的所有线程(即方法返回)。

因此,在您的情况下,对await()的调用在第三次调用发生之前不会返回,因此您的两个现有线程实际上被卡住了。这在技术上不是死锁,因为它可以很容易地摆脱(通过对await())。

 类似资料:
  • 本文向大家介绍详解Java回环屏障CyclicBarrier,包括了详解Java回环屏障CyclicBarrier的使用技巧和注意事项,需要的朋友参考一下   上一篇说的CountDownLatch是一个计数器,类似线程的join方法,但是有一个缺陷,就是当计数器的值到达0之后,再调用CountDownLatch的await和countDown方法就会立刻返回,就没有作用了,那么反正是一个计数器,

  • 主要内容:1 CyclicBarrier的概述,2 CyclicBarrier的原理,2.1 基本结构,2.2 await等待,2.3 await(timeout unit)超时等待,2.4 reset重置屏障,3 CyclicBarrier的使用,4 CyclicBarrier的总结详细介绍了CyclicBarrier循环屏障的原理和应用,以及与CountDownLatch的对比! 1 CyclicBarrier的概述 public class CyclicBarrier extends Ob

  • 我有一个情况,我很难找到一个干净的解决方案。我会尽量详细解释的。 我有一个树状的结构: 我需要处理根节点: 换句话说,一旦处理了和,就可以处理。我以递归的方式处理节点,没有什么壮观的。 到目前为止,一切都很好。现在我要声明一个全局执行器服务,它有固定数量的线程。我想并行处理一个节点的子节点。因此,和可以在各自的线程中进行处理。代码如下所示: 这里的问题是:当达到一定深度时,。我们已经到了缺线的情况

  • 我有一个Makefile的目标与几个作业运行是并行的选项。 完成这些工作可能需要不同的时间。我是否有办法确保在进入构建过程的下一阶段之前完成所有这些工作?

  • 我应该在某个进程中创建49个线程(我的问题中有多个进程,所以让我们称进程为P3)。我已经创建了这些线程,但问题出现在这里:在任何时候,最多允许5个线程在P3中运行,而不计算主进程。只有当共有5个线程正在运行时,P3中的线程13才允许结束(线程13在这5个线程中)。我的问题是:我如何确保在程序执行的某个时候会有5个线程在运行,其中会有线程13,以便它可以结束它的执行。我使用C作为编程语言,Linux

  • 问题内容: 在过去的问题中,我询问了如何在不破坏种族的情况下实现pthread屏障: 从迈克尔·伯尔(Michael Burr)那里获得了针对过程本地障碍的完美解决方案,但是对于过程共享的障碍却没有。我们后来研究了一些想法,但从未得出令人满意的结论,甚至没有开始涉及资源故障案例。 在Linux上能否制造出满足以下条件的障碍: 进程共享的(可以在任何共享内存中创建)。 在屏障等待函数返回后,可以安全