ReentrantLock、CountDownLatch、CyclicBarrier简介

ReentrantLock、CountDownLatch、CyclicBarrier

1、ReentrantLock可重入互斥锁

公平锁与非公平锁的释放锁步骤是一致的。获取锁的过程不一致,非公平锁是让当前线程优先独占,而公平锁则是让等待时间最长的线程优先,非公平的可能让其他线程没机会执行,而公平的则可以让等待时间最长的先执行,但是性能上会差点。

2、CountDownLatch是一个线程(或者多个线程)等待(await)多个线程(countDown),当多个线程都countDown完,await线程继续往后执行。
这里写图片描述

3、CyclicBarrier是多个线程相互等待(await),当所有都await后一起继续往后执行。

ReentrantLock Demo

class ReentrantLockDemo {
  private final ReentrantLock lock = new ReentrantLock();

  public void m() {
    lock.lock();
    try {
      // ... method body
    } finally {
      lock.unlock()
    }
  }
}

CountDownLatch Demo

public class CountDownLatchDemo { 

    public static void main(String[] args){

        final CountDownLatch latch = new CountDownLatch(10);

        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<Runnable>(5));
        for(int i=0;i<10;i++){
            TestTask task=new TestTask("task_" + (i+1),latch);
            executor.execute(task);
        }

        try {
            System.out.println("等待10个子线程执行完毕...");
            latch.await();
            System.out.println("10个子线程已经执行完毕");
            System.out.println("继续执行主线程");
        }catch(Exception e){
            e.printStackTrace();
        }

        executor.shutdown();        
    }
}

class TestTask implements Runnable{

    private String name;

    private CountDownLatch latch;

    public TestTask(String name,CountDownLatch latch){
        this.name=name;
        this.latch=latch;
    }

    @Override
    public void run() {
        System.out.println(name + " start running.");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + " start end.");
        this.latch.countDown();
    }  
}

CyclicBarrier Demo

public class CyclicBarrierDemo { 
    public static void main(String[] args){
        CyclicBarrier barrier  = new CyclicBarrier(10);
        ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 200, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<Runnable>(5));
        for(int i=0;i<10;i++){
            TestTask task=new TestTask("客人_" + (i+1),barrier,i);
            executor.execute(task);
        }       
    }
}

class TestTask implements Runnable{

    private String name;

    private CyclicBarrier barrier;

    private int index;

    public TestTask(String name,CyclicBarrier barrier,int index){
        this.name=name;
        this.barrier=barrier;
        this.index=index;
    }

    @Override
    public void run() {       
        try {
            Thread.sleep(1000 + this.index*1000);
            System.out.println(name + " 哥已到");
            Thread.sleep(1000 + this.index*2000);
            System.out.println(name + " 哥已就坐,其他几个哥赶快啊,哥饿啦.");
            this.barrier.await();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(name + "终于都到啦,开吃啦");

    }  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CountDownLatch 是一个计数器,它可以让一个或多个线程等待其他线程执行完毕后再继续执行。它的主要方法是 countDown() 和 await(),其中 countDown() 用于计数减一,await() 用于等待计数器变为0。与 CountDownLatch 相比,CyclicBarrier 的主要区别在于它可以重复使用,而且所有线程必须同时到达栅栏处才能继续执行后续任务。CyclicBarrier 的重要方法是 await(),并且可以通过构造方法传入一个 Runnable,在所有线程都到达栅栏状态时优先执行该动作。CyclicBarrier 内部使用 ReentrantLock 和 Condition 实现等待和唤醒的功能,通过维护一个 count 变量来记录还有多少个线程没有到达栅栏处。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [CountDownLatchCyclicBarrier](https://blog.csdn.net/weixin_44442186/article/details/123985119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JUC多线程CountDownLatchCyclicBarrier、Semaphore同步器原理总结](https://blog.csdn.net/a745233700/article/details/120688546)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值