gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:06:07 26 4
gpt4 key购买 nike

运行以下代码时,2个启动线程将被CyclicBarrier *对象锁定,并无限等待第三个线程解锁

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();
}

}

因此,第 2 个启动的线程正在等待第三个线程来解决此障碍。然而,根据CyclicBarrier的Java API文档,CyclicBarrier

A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point

我对他们如何“等待对方”感到困惑,

问题:“互相等待”是否意味着循环等待?如果是这样,怎么办?严格来说,这是一种僵局吗?

最佳答案

您可以将 CyclicBarrier 视为根本不了解线程本身。可以这样想:

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

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

它被称为循环的原因是,一旦计数被重置并且线程被释放,它就可以再次使用。典型的用法是将派对设置为要在其上同步的线程数,并且这些线程都进入某种循环,从而使用屏障来确保没有线程继续移动到下一次迭代,直到所有其他线程也完成当前迭代。

关于java - 当通过屏障(例如 CyclicBarrier)的线程数量小于屏障限制时,屏障(例如 CyclicBarrier)是否会导致死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51309423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com