Java中的共享锁CountDownLatch及源码解析

 更新时间:2023年11月16日 09:28:40   作者:立小研先森  
这篇文章主要介绍了Java中的共享锁CountDownLatch及源码解析,CountDownLatch是一种同步辅助工具,允许一个或多个线程等待,直到在其它线程中执行的一组操作完成;CountDownLatch使用指定的计数初始化,需要的朋友可以参考下

前言

CountDownLatch是一种同步辅助工具,允许一个或多个线程等待,直到在其它线程中执行的一组操作完成;CountDownLatch使用指定的计数初始化。

wait方法会阻塞,直到当前计数由于countDown方法的调用而达到零,之后所有的等待线程都会被释放,任何后续的wait调用都会立即返回。这是一种一次性现象,计数无法重置。如果需要重置计数的版本,可以参考CyclicBarrier。

一、CountDownLatch的使用方法

public class Test {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("线程一执行完成");
                latch.countDown();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("线程二执行完成");
                latch.countDown();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程三执行完成");
                latch.countDown();
            }
        }).start();
        System.out.println("主线程等待");
        latch.await();
        System.out.println("主线程开始执行");
    }
}

执行结果如下:

线程三执行完成
主线程等待
线程二执行完成
线程一执行完成
主线程开始执行

上面的示例是一个主线程等待其它三个 线程执行,执行完成后调用countDown方法,计数减一,直到所有的线程执行完成,计数归0,然后await方法放回,主线程继续执行。

二、CountDownLatch源码解析

  public void countDown() {
        sync.releaseShared(1);
    }

countDown方法会递减锁的计数器,如果计数为0,则释放所有等待的线程。如果当前计数大于0,则递减。如果新计数为0,则出于线程调度的目的重新启用所有等待线程。如果当前计数等于0,那么什么也不发生。

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

await方法会使当前线程等待,直到锁的计数器为0,除非线程被中断。如果当前计数为0,则此方法立即返回。如果当前计数大于0,则出于线程调度目的,当前线程将被禁用,并处于休眠状态,直到发生一下两种情况之一:

1.由于调用了countDown方法,计数达到了0;

2.其它线程终端当前线程;

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

相关文章

  • Springboot基于Redisson实现Redis分布式可重入锁源码解析

    Springboot基于Redisson实现Redis分布式可重入锁源码解析

    这篇文章主要介绍了Springboot基于Redisson实现Redis分布式可重入锁,本文通过案例源码分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java JTable 实现日历的示例

    Java JTable 实现日历的示例

    这篇文章主要介绍了Java JTable 实现日历的示例,帮助大家更好的理解和学习Java jtable的使用方法,感兴趣的朋友可以了解下
    2020-10-10
  • springboot整合prometheus实现资源监控的详细步骤

    springboot整合prometheus实现资源监控的详细步骤

    Spring Boot与Prometheus的整合可以实现对Spring Boot应用的实时监控,有助于更好地维护应用的性能,本文给大家介绍springboot整合prometheus实现资源监控的详细步骤,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • NIO深入理解FileChannel使用方法原理

    NIO深入理解FileChannel使用方法原理

    这篇文章主要为大家介绍了NIO深入理解FileChannel的源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Java的方法和this关键字如何理解与应用

    Java的方法和this关键字如何理解与应用

    Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function)。对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号{}当中,并且起一个名字。使用代码的时候,直接找到名字调用即可
    2021-10-10
  • Java8如何通过Lambda处理List集合

    Java8如何通过Lambda处理List集合

    这篇文章主要介绍了java8如何通过Lambda处理List集合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Jmeter压力测试简单教程(包括服务器状态监控)

    Jmeter压力测试简单教程(包括服务器状态监控)

    Jmeter是一个非常好用的压力测试工具。Jmeter用来做轻量级的压力测试,非常合适,本文详细的介绍了Jmeter的使用,感性的可以了解一下
    2021-11-11
  • SpringBoot的SPI机制源码解析

    SpringBoot的SPI机制源码解析

    这篇文章主要为大家介绍了SpringBoot的SPI机制源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • java实现大文件分割与合并的实例代码

    java实现大文件分割与合并的实例代码

    java实现大文件分割与合并的实例代码,需要的朋友可以参考一下
    2013-03-03
  • java学习之JVM运行时常量池理解

    java学习之JVM运行时常量池理解

    这篇文章主要介绍了java学习之JVM运行时常量池理解,对常量池的好处以及基本类型的包装类常量池等作了简要分析,有需要的朋友可以借鉴参考下
    2021-09-09

最新评论