多线程及并发面试基础(6)——CountDownLatch/CyclicBarrier/Semaphore

CountDownLatch
定义:让一些线程阻塞直到另一些线程完成一些列操作之后才被唤醒。
即使门闩的意思,给定一个数,当这个数被减到0时才能开始运行另一个线程。

主要有两个方法一个是await方法等待,一个是countDown方法让门闩减一。
可以简单理解为:
从自助餐拿的吃的必须吃完才会开门放人离开,不然打断腿。

代码:假如拿了5个蛋糕,必须吃完才可以走。

/***
 * CountDownLatch 的使用. 自助餐拿的5个蛋糕吃完才能走,不然打断腿
 */
public class CountDownLatchDemo {
    static CountDownLatch countDownLatch = new CountDownLatch(5);
    public static void main(String[] args) throws InterruptedException {
        for (int i = 1; i<= 5; i++) {
            final int temp = i;
            new Thread(()->{
           System.out.println(Thread.currentThread().getName() + "\t" + "蛋糕"+ temp + "号已吃完");
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
        countDownLatch.await();
        System.out.println("蛋糕吃完了 开门放人");
    }
}

输出结果:
CountDownLatch代码结果
2、CyclicBarrier的字面意思是循环使用屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。

和CountDownLatch相反,这个是加法,而countdownLatch是减法。
几个简单例子: 集齐七颗龙珠才能召唤神龙

实例代码:

/***
 * 跟CountDownLatch相反    集齐七颗龙珠才能召唤神龙
 */
public class CyclicBarrierDemo {
    static CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
        System.out.println("召唤神龙");
    });

    public static void main(String[] args) {
         for (int i = 1; i<8 ; i++) {
             final int temp =i;
             new Thread(()->{
                 System.out.println(Thread.currentThread().getName() + "\t" + temp+"号龙珠已拿到");
                 try {
                     cyclicBarrier.await();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 } catch (BrokenBarrierException e) {
                     e.printStackTrace();
                 }
             },String.valueOf(i)).start();
         }
    }
}

输出结果:
CyclicBarrier演示
3、Semaphore
信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。

简单的说就是抢车位,10个人来抢5个车位。
很重要的一个,经常会用到。

/****
 * semaphore 信号量 .相当于抢车位,有限的车位如果满了必须要有车离开之后才能继续进
 */
public class SemaphoreDemo {

    static Semaphore semaphore = new Semaphore(5);

    public static void main(String[] args) {
         for (int i = 1; i<=10; i++) {
             final int temp=i;
             new Thread(()->{
                 try {
                     semaphore.acquire();
                     System.out.println(Thread.currentThread().getName()+"\t"+temp+"抢到了车位");
                     try {
                         TimeUnit.SECONDS.sleep(3);
                         System.out.println("三秒之后"+Thread.currentThread().getName()+"释放锁");
                     }catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }finally {
                     semaphore.release();
                 }
             },String.valueOf(i)).start();
         }
    }
}

输出结果:
Semaphore演示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值