Semaphore、CyclicBarrier和CountDownLatch三者的区别

Semaphore

首先我们来看看Semaphore,中文名称信号量

我们来看看它的最常使用的方式

在这里插入图片描述

Semaphore semaphore = new Semaphore(1);

我们通过这个构造方法,传进去一个int型变量,这就是通过这个int型变量,来限制线程所能使用的资源,当我们通过semaphore.acquire();方法来阻塞线程的执行,比如我下面这种情况

public class demo1 {
    Semaphore semaphore1 = new Semaphore(1);
    Semaphore semaphore2 = new Semaphore(0);
    Semaphore semaphore3 = new Semaphore(0);
    
    public void m1() throws InterruptedException {
        semaphore1.acquire();
        System.out.println("第一执行");
        semaphore2.release();
    }
    public void m2() throws InterruptedException {
        semaphore2.acquire();
        System.out.println("第二执行");
        semaphore3.release();
    }
    public void m3() throws InterruptedException {
        semaphore3.acquire();
        System.out.println("第三执行");

    }
}

我使用三个线程来分别执行这三个方法,怎么保证执行顺序呢?这就可以使用信号量来解决

我们定义了三个信号量同时竞争一个资源,当竞争到资源的线程才可以往下执行方法,要不然会一直阻塞在semaphore1.acquire();,还有就是我semaphore1获取资源执行完方法之后,如果是调用semaphore1.release()来释放资源,会造成一个后果,也就是semaphore2semaphore3都可以竞争资源,就容易造成乱序,所以semaphore1在执行完方法后,需要调用semaphore2release()来释放资源,这样只有semaphore2能通过semaphore2.acquire();来获取资源了

也就是可以规定下一个获取资源的信号量是谁,保证了执行顺序

CyclicBarrier

中文译为屏障,举个例子吧,有一辆车可以坐30人,当所有人都到了上车之后车才可以开走,它是可以循环调用的,也就是说一辆车走后,还有车等着,再来30人之后车才开走,不断循环

在这里插入图片描述
CyclicBarrier通过await()方法阻塞线程,如果人数不够,就会阻塞,每调用一次await(),就会加一人,当到达设置的人数时,则执行下面的方法

	CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
	cyclicBarrier.await();

CountDownLatch

在这里插入图片描述

内部维护了一个计数器,类似倒计时那样的形式,我们预先设置一个值,当我们调用一次countDown()方法计时器减1,我们使用await()阻塞线程,当计时器变为0时,调用await()阻塞的线程才会变为非阻塞,继续执行下去

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀顶峰相见的PET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值