Java并发编程之CountDownLatch解读

 更新时间:2023年12月31日 09:07:40   作者:_Romeo  
这篇文章主要介绍了Java并发编程之CountDownLatch解读,是通过一个计数器来实现的,计数器的初始值是线程的数量,countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行,需要的朋友可以参考下

概念

  • countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
  • 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

源码

countDownLatch类中只提供了一个构造器:

//参数count为计数值
public CountDownLatch(int count) {  };  

类中有三个方法是最重要的:

//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public void await() throws InterruptedException { };   
//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  
//将count值减1
public void countDown() { };  

自定义实现一个CountDownLatch

代码如下:

public class KaneCountDownLatch {
    private KaneCountDownLatch.Sync sync;
    public KaneCountDownLatch(int count) {
        this.sync = new KaneCountDownLatch.Sync(count);
    }
    public void countDown() {
        this.sync.releaseShared(1);
    }
    public void await() {
        this.sync.acquireShared(1);
    }
    class Sync extends AbstractQueuedSynchronizer {
        public Sync(int count) {
            this.setState(count);
        }
        protected int tryAcquireShared(int arg) {
            return this.getState() == 0 ? 1 : -1;
        }
        protected boolean tryReleaseShared(int arg) {
            int c;
            int nextc;
            do {
                c = this.getState();
                if (c == 0) {
                    return false;
                }
                nextc = c - 1;
            } while(!this.compareAndSetState(c, nextc));
            return nextc == 0;
        }
    }
}

测试代码如下:

public class CountDownLatch_Demo {
    public static void main(String[] args) throws InterruptedException {
        KaneCountDownLatch latch = new KaneCountDownLatch(6); //计数为6
        for (int i = 0; i <6 ; i++) {
            new Thread(()->{
                System.out.println("开始准备.....");
                latch.countDown();//计数减一
            }).start();
            Thread.sleep(1000);
        }
        latch.await(); //每个线程执行一次,则-1,在latch为0的时候开始向下运行 这是这些线程都准备就绪,然后去一起干同一件事
        //还有一种方式, 将一个活分为多段,每个线程去干一段
//        for (int i = 0; i <6 ; i++) {
//            new Thread(()->{
//                  latch.countDown(); // 计数减一
//                try {
//                    latch.await(); // 阻塞 -- > 0
//                    System.out.println("线程:"+Thread.currentThread().getName()+"执行完毕");
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }).start();
//        }
        System.out.println("开始干活....");
    }
}

CountDownLatch和CyclicBarrier区别

  • countDownLatch是一个计数器,线程完成一个记录一个,计数器递减,只能只用一次
  • CyclicBarrier的计数器更像一个阀门,需要所有线程都到达,然后继续执行,计数器递增,提供reset功能,可以多次使用

到此这篇关于Java并发编程之CountDownLatch解读的文章就介绍到这了,更多相关CountDownLatch解读内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现简单超市管理系统

    java实现简单超市管理系统

    这篇文章主要为大家详细介绍了java实现简单超市管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Java多线程ThreadPoolExecutor详解

    Java多线程ThreadPoolExecutor详解

    这篇文章主要介绍了Java多线程ThreadPoolExecutor详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Spring项目如何实现带请求链路id的日志记录

    Spring项目如何实现带请求链路id的日志记录

    我们在做项目的时候通常需要通过请求日志来排查定位线上问题,如果日志比较多而我们又需要查找整个请求的全部日志的时候会比较困难,下面我们就来看看如何用java aop实现请求id的日志记录吧
    2024-12-12
  • Idea如何自定义VM配置

    Idea如何自定义VM配置

    这篇文章主要介绍了Idea如何自定义VM配置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Shiro整合Springboot和redis,jwt过程中的错误shiroFilterChainDefinition问题

    Shiro整合Springboot和redis,jwt过程中的错误shiroFilterChainDefinition问

    这篇文章主要介绍了Shiro整合Springboot和redis,jwt过程中的错误shiroFilterChainDefinition问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java内存之happens-before和重排序

    Java内存之happens-before和重排序

    在JMM(Java内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。下面小编来简单介绍一下
    2019-05-05
  • Springboot 集成spring cache缓存的解决方案

    Springboot 集成spring cache缓存的解决方案

    这篇文章主要介绍了Springboot 集成spring cache缓存,使用缓存最关键的一点就是保证缓存与数据库的数据一致性,本文给大家介绍最常用的缓存操作模式,对Springboot 集成spring cache缓存操作流程感兴趣的朋友一起看看吧
    2022-06-06
  • Hibernate一对多关联双向关联代码实现分享

    Hibernate一对多关联双向关联代码实现分享

    Hibernate一对多关联双向关联代码实现分享,大家参考使用吧
    2013-12-12
  • Hadoop源码分析二安装配置过程详解

    Hadoop源码分析二安装配置过程详解

    本篇是Hadoop源码分析系列文章第二篇,主要介绍Hadoop安装配置的详细过程,后续本系列文章会持续更新,有需要的朋友可以借鉴参考下
    2021-09-09
  • MyBatis 如何使项目兼容多种数据库的解决方案

    MyBatis 如何使项目兼容多种数据库的解决方案

    要想做兼容多种数据库,那毫无疑问,我们首先得明确我们要兼容哪些数据库,他们的数据库产品名称是什么,本次我们讲解了一套使项目兼容多种数据库的方案,对MyBatis项目兼容多种数据库操作方法感兴趣的朋友一起看看吧
    2024-05-05

最新评论