Java中CountDownLatch的原理是什么

  介绍

本篇文章为大家展示了Java中CountDownLatch的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Java的特点有哪些

Java的特点有哪些   1. java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。   2. java具有简单性,面向对象,分布式、安全性,平台独立与可移植性,动态性等特点。   3.使用Java可以编写桌面应用程序,网络应用程序,分布式系统和嵌入式系统应用程序等。

<强>一、CountDownLatch

<强>【1】CountDownLatch是什么?

CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或

多个线程一直等待。

闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行:

<李>

确保某个计算在其需要的所有资源都被初始化之后才继续执行;

<李>

确保某个服务在其依赖的所有其他服务都已经启动之后才启动;

<李>

等待直到某个操作所有参与者都准备就绪再继续执行;

CountDownLatch有一个正数计数器,倒计时()方法对计数器做减操作,等待()方法等待计数器达到0。所有等待的线程都会阻塞直到计数器为0或者等待线程中断或者超时。

闭锁(倒计时锁)主要用来保证完成某个任务的先决条件满足。是一个同步工具类,用来协调多个线程之间的同步。这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行。

<强>【2】CountDownLatch的两种典型用法

①某一线程在开始运行前等待n个线程执行完毕。

将CountDownLatch的计数器初始化为n:新CountDownLatch (n),每当一个任务线程执行完毕,就将计数器减1 countdownlatch.countDown(),当计数器的值变为0时,在CountDownLatch上等待()的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。

②实现多个线程开始执行任务的最大并行性。

注意是并行性,不是并发,强调的是多个线程在某一时刻同时开始执行。类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑。做法是初始化一个共享的CountDownLatch对象,将其计数器初始化为1:新CountDownLatch(1),多个线程在开始执行任务前首先coundownlatch.await(),当主线程调用倒计时()时,计数器变为0,多个线程同时被唤醒。

如下例所示,在多线程运行的情况下,计算多线程耗费的时间:

public  class  TestCountDownLatch  {//CountDownLatch 才能为唯一的,共享的资源   static 才能CountDownLatch  CountDownLatch =, new  CountDownLatch (5);      static 才能class  LatchDemo  extends 螺纹{   ,,@Override   ,,,public  void 运行(),{   ,,,,,int  sum =, 0;   ,,,,,for  (int 小姐:=,0;,小姐:& lt;, 1000000;,我+ +),{   ,,,,,,,和+ +;   ,,,,,}   ,,,,,System.out.println (getName() +“计算结果:“+总和);   ,,,,,countDownLatch.countDown ();   ,,,}   ,,}   public 才能;static  void  main (String [], args), throws  InterruptedException  {      ,,,long  begin =, System.currentTimeMillis ();   ,,,System.out.println(“开始了- - - - -产生绯闻;+开始);   ,,,for  (int 小姐:=,0;,小姐:& lt;, 5;,我+ +),{   ,,,,,new  LatchDemo () .start ();   ,,,}   ,,,countDownLatch.await ();      ,,,long 最终获得=,System.currentTimeMillis ();   ,,,System.out.println(“结束了- - - - -产生绯闻;+结束);   ,,,System.out.println(“总共用时:“+ (end-begin));   ,,}   }/* *   开始了- - - - - -1571144894551   Thread-3计算结果:1000000   Thread-0计算结果:1000000   线程1计算结果:1000000   线程2计算结果:1000000   Thread-4计算结果:1000000   结束了- - - - - -1571144894559   总共用时:8   */

<强>二,CyclicBarrier

<强>【1】CyclicBarrier是什么?
CyclicBarrier即栅栏类,与CountDownLatch类似。它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。

Java中CountDownLatch的原理是什么