Java并发编程之CountDownLatch解析

 更新时间:2023年12月20日 10:00:07   作者:Brain_L  
这篇文章主要介绍了Java并发编程之CountDownLatch解析,Sync为一个实现了AQS的内部类,代理CountDownLatch的获取和释放操作,需要所有线程等待某个条件完成后,才执行某个动作时,可以使用CountDownLatch,需要的朋友可以参考下

Java的CountDownLatch

ReentrantLock为独占锁,也即排他锁,同一时刻只能有一个线程持有锁。现在来看几种共享锁。

CountDownLatch

public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
}
private final Sync sync;
private static final class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = 4982264981922014374L;
        Sync(int count) {
            //设置资源总数
            setState(count);
        }
        int getCount() {
            return getState();
        }
        protected int tryAcquireShared(int acquires) {
            //资源
            return (getState() == 0) ? 1 : -1;
        }
        protected boolean tryReleaseShared(int releases) {
            // Decrement count; signal when transition to zero
            for (;;) {
                //1、获取当前资源数
                int c = getState();
                if (c == 0)
                    return false;
                //2、释放一个资源
                int nextc = c-1;
                //3、CAS更新资源数
                if (compareAndSetState(c, nextc))
                    return nextc == 0;
            }
        }
    }

生成CountDownLatch时需要传入资源总数,代表所有线程总共享有这么多资源。

Sync为一个实现了AQS的内部类,代理CountDownLatch的获取和释放操作。

public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }
public void countDown() {
        sync.releaseShared(1);
    }

线程调用countDown时,最终调用Sync中的tryReleaseShared,将总资源减1。

调用await时,最终调用Sync中tryAcquireShared,看资源是否全部释放完。

需要所有线程等待某个条件完成后,才执行某个动作时,可以使用CountDownLatch。

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

相关文章

  • 详解springboot启动时是如何加载配置文件application.yml文件

    详解springboot启动时是如何加载配置文件application.yml文件

    这篇文章主要介绍了详解springboot启动时是如何加载配置文件application.yml文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java异常处理try catch的基本使用

    Java异常处理try catch的基本使用

    大家好,本篇文章主要讲的是Java异常处理try catch的基本使用,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 浅谈java中字节与字符的区别

    浅谈java中字节与字符的区别

    这篇文章主要介绍了浅谈java中字节与字符的区别,字节是java中的基本数据类型,用来申明字节型的变量;字符是语义上的单位,它是有编码的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Mybatis Plus select 实现只查询部分字段

    Mybatis Plus select 实现只查询部分字段

    这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 详解Java中多进程编程的实现

    详解Java中多进程编程的实现

    这篇文章主要介绍了详解Java中多进程编程的实现,和多线程一样,多进程同样是实现并发的一种方式,需要的朋友可以参考下
    2015-11-11
  • Maven打包JavaWeb项目的两种实现方式

    Maven打包JavaWeb项目的两种实现方式

    介绍了两种Maven打包Web项目的方式:通过Eclipse和通过命令行,Eclipse方式包括清理、打包、跳过测试、输入 Goals 等步骤,命令行方式包括进入项目目录、执行 clean 和 package 命令、跳过测试等步骤,注意事项包括确保有JDK环境、正确配置pom.xml文件和修改版本号
    2025-02-02
  • SpringBoot中实现大文件分片下载和断点续传功能的完整指南

    SpringBoot中实现大文件分片下载和断点续传功能的完整指南

    在Spring Boot中实现大文件分片下载和断点续传功能,需结合HTTP Range协议和文件流处理技术,本文将展示完整的实现方法,有需要的小伙伴可以参考一下
    2025-09-09
  • java读取磁盘并遍历磁盘文件过程解析

    java读取磁盘并遍历磁盘文件过程解析

    这篇文章主要介绍了java读取磁盘并遍历磁盘文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java中数组array和列表list相互转换

    Java中数组array和列表list相互转换

    这篇文章主要介绍了Java中数组array和列表list相互转换,在Java中,可以将数组(array)和列表(list)相互转换,但需要注意一些细节和限制,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 原因分析IDEA导入Spring-kafka项目Gradle编译失败

    原因分析IDEA导入Spring-kafka项目Gradle编译失败

    这篇文章主要为大家介绍分析了IDEA导入Spring-kafka项目Gradle中编译失败原因及解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02

最新评论