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解读内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot MongoCustomConversions自定义转换方式

    SpringBoot MongoCustomConversions自定义转换方式

    这篇文章主要介绍了SpringBoot MongoCustomConversions自定义转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • MyBatis深入解读动态SQL的实现

    MyBatis深入解读动态SQL的实现

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦
    2022-04-04
  • Java数据结构之Map与Set专篇讲解

    Java数据结构之Map与Set专篇讲解

    这篇文章通过实例面试题目来讲解Java中Map和Set之间的关系,具有很好的参考价值,Map与Set在面试中经常会遇到。一起跟随小编过来看看吧
    2022-01-01
  • Java多线程处理文件的示例详解

    Java多线程处理文件的示例详解

    在Java编程中,文件处理是一项常见的任务,为了提高文件处理的效率,我们可以使用多线程技术,本文将详细介绍如何使用Java多线程来处理文件,需要的可以参考下
    2024-12-12
  • java分割文本字符串的方法

    java分割文本字符串的方法

    这篇文章主要为大家详细介绍了java分割文本字符串的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java防止代码被动态篡改的解决方案和代码示例

    Java防止代码被动态篡改的解决方案和代码示例

    在Java中,反射攻击是一种通过动态访问或修改类、方法、字段等私有成员的攻击方式,可能导致敏感数据泄露、权限绕过或系统崩溃,为了防止代码被动态篡改,需要从 访问控制、输入验证、安全机制、代码加固 等多方面入手,以下是详细的解决方案和代码示例
    2025-07-07
  • Java8中接口的新特性测试

    Java8中接口的新特性测试

    今天小编就为大家分享一篇关于Java8中接口的新特性测试,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • java 详解类加载器的双亲委派及打破双亲委派

    java 详解类加载器的双亲委派及打破双亲委派

    这篇文章主要介绍了java 详解类加载器的双亲委派及打破双亲委派的相关资料,需要的朋友可以参考下
    2017-01-01
  • Java语言实现简单的酒店前台管理小功能(实例代码)

    Java语言实现简单的酒店前台管理小功能(实例代码)

    这篇文章主要介绍了Java语言实现简单的酒店前台管理小功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java concurrency线程池之线程池原理(二)_动力节点Java学院整理

    Java concurrency线程池之线程池原理(二)_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java concurrency线程池之线程池原理第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论