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

相关文章

  • java如何实现基于opencv全景图合成实例代码

    java如何实现基于opencv全景图合成实例代码

    全景图相信大家应该都不陌生,下面这篇文章主要给大家介绍了关于java如何实现基于opencv全景图合成的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • SpringBoot与gRPC2.0集成的实现示例

    SpringBoot与gRPC2.0集成的实现示例

    本文主要介绍了SpringBoot与gRPC2.0集成,包括HTTP/2支持、ProtocolBuffers增强、服务定义改进等内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • Java中Executor和Executors的区别小结

    Java中Executor和Executors的区别小结

    在Java并发编程中,Executor是一个核心接口,提供了任务执行的抽象方法,而Executors是一个工具类,提供了创建各种线程池的工厂方法,Executor关注任务的执行,而Executors关注如何创建适合的执行器,感兴趣的可以了解一下
    2024-10-10
  • Java Lambda表达式和函数式接口实例分析

    Java Lambda表达式和函数式接口实例分析

    这篇文章主要介绍了Java Lambda表达式和函数式接口,结合实例形式分析了Java8 Lambda表达式和函数式接口相关原理、用法及操作注意事项,需要的朋友可以参考下
    2019-09-09
  • feign远程调用无法传递对象属性405的问题

    feign远程调用无法传递对象属性405的问题

    这篇文章主要介绍了feign远程调用无法传递对象属性405的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 简单实现java抽奖系统

    简单实现java抽奖系统

    这篇文章主要教大家如何简单实现java抽奖系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • SpringCloud Alibaba Seata (收藏版)

    SpringCloud Alibaba Seata (收藏版)

    Seata是一款开源的分布式事务解决方案,致力于在微服务架构在提供高性能和简单一样的分布式事务服务。这篇文章主要介绍了SpringCloud Alibaba Seata 的相关知识,需要的朋友可以参考下
    2020-10-10
  • SpringBoot中集成串口通信的项目实践

    SpringBoot中集成串口通信的项目实践

    本文主要介绍了SpringBoot中集成串口通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • SWT(JFace)体验之List演示汇总

    SWT(JFace)体验之List演示汇总

    SWT(JFace)体验之List演示代码汇总
    2009-06-06
  • spring使用OXM进行对象XML映射解析

    spring使用OXM进行对象XML映射解析

    这篇文章主要介绍了spring使用OXM进行对象XML映射解析,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12

最新评论