摘要

本文主要介绍Java多线程并发中闭锁(Latch)的基本概念、原理、示例代码、应用场景,通过学习,可以掌握多线程并发时闭锁(Latch)的使用方法。

概念

“闭锁”就是指一个被锁住了的门将线程a挡在了门外(等待执行),只有当门打开后(其他线程执行完毕),门上的锁才会被打开,a才能够继续执行。

闭锁(Latch),目的是使多个线程在完成各自任务后,才会打开继续执行后面的任务,否则一直等待。

计数器闭锁(CountDownLatch)是一个同步工具类, 可以用来协调多个线程的执行时间,允许一个或多个线程等待某个事件的发生。

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

例如, 可以让a线程在其他线程运行完毕后再执行。如果其他线程没有执行完毕,则a线程就会一直等待。

原理分析

CountDownLatch的实现原理:

1、CountDownLatch在创建时, 会指定一个计数器,表示等待线程的执行数量(比如,3就表示当3个线程执行完毕后,再结束闭锁,使a能够继续执行);

2、 其他每个线程在各自执行完毕时, 分别调用一次countDown())方法,用来递减计数器, 表示有一个线程已经执行完毕了;这时, 线程a可以调用await()方法, 用来等待计数器的值为0。

3、如果计数器的值大于0, 那么await()方法会一直阻塞, 直到计数器为0时,线程a才会继续执行;

4、如果线程a一直无法等到计数器为0,则会显示等待超时,当然也可以在线程a等待时,通过程序中断等待。

示例代码

在Java中, 可以使用CountDownLatch实现多线程闭锁,具体实现代码如下:

public class JavaLearnsCountDownLatch {

public static void main(String[] args) {

//计数器为8

CountDownLatch countDownLatch = new CountDownLatch(8);

//将CountDownLatch对象传递到线程的run()方法中,当每个线程执行完毕run()后就将计数器减1

MyThread myThread = new MyThread(countDownLatch);

long start = System.currentTimeMillis();

//创建8个线程,并执行

for (int i = 0; i <8; i++) {

new Thread(myThread).start();

}

try {

//主线程(main)等待:等待的计数器为0;即当CountDownLatch中的计数器为0时,Main线程才会继续执行。

countDownLatch.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

long end = System.currentTimeMillis();

System.out.println("耗时:" + (end - start));

}

}

class MyThread implements Runnable {

private CountDownLatch latch;

public MyThread(CountDownLatch latch) {

this.latch = latch;

}

@Override

public void run() {

try {

Thread.sleep(5000);

}catch (InterruptedException e){

e.printStackTrace();

}

finally {

latch.countDown();//每个子线程执行完毕后,触发一次countDown(),即计数器减1

}

}

}

应用场景

1、确保某个计算,在其需要的所有资源都准备就绪后再执行,比如:要计算某个工程材料的合价,要知道材料的单价和工程量后,才能执行材料合价计算。

2、确保某个服务,在其依赖的所有其他服务都已经启动后再启动。

3、确保某个任务,在所有参与者都准备就绪后再执行,比如:线上上课,在全班30个同学都全部上线后,老师才能开始上课。

我是一名码龄10年的程序员,在这里会分享实在干货,让你少走弯路,成就精彩人生。

闭锁java_Java项目实践,CountDownLatch实现多线程闭锁相关推荐

  1. Kotlin项目实践指南(上)

    关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流 ...

  2. 项目实践精解:C#核心技术应用开发

    前 言 学习任何技术都要从基础开始,这本书就是讲解C#核心技术的基础教材.读者如果简单调研一下就不难发现,市面上最多的就是这类C#基础类教材.那么,我们还有没有必要再多写一本没有特色.枯燥乏味的书呢? ...

  3. Unix编程要学习的内容(2)《精通Unix下C语言与项目实践》读书笔记(12)

    文章试读  不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的职场感悟吧.不值钱的软件人才 精力充沛与事业成功   让系分来得更猛 ...

  4. python从入门到实践源代码-Python从入门到项目实践 PDF 全彩带源码版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.入门.项目实践方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小2.1 GB,admin编写,目前豆瓣.亚马逊.当 ...

  5. python项目实例源码哪里下载-Python从入门到项目实践 PDF 全彩带源码版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.入门.项目实践方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小2.1 GB,admin编写,目前豆瓣.亚马逊.当 ...

  6. SVM算法在项目实践中的应用!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:苏丽敏,Datawhale优秀学习者,北理工计算机硕士 支持向量机 ...

  7. SAP WM Storage Location Reference在项目实践中的使用

    SAP WM Storage Location Reference在项目实践中的使用 笔者目前所在的一个项目是一个已经上了SAP系统,但是需要扩展到新工厂的项目.该项目在组织结构设计的时候,结合业务的 ...

  8. 学习Unix,可从事什么样的工作(1)《精通Unix下C语言与项目实践》读书笔记(3)...

    <精通Unix下C语言编程与项目实践>读书笔记(new) 文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的 ...

  9. Node.js项目实践:构建可扩展的Web应用

    2019独角兽企业重金招聘Python工程师标准>>> Node.js项目实践:构建可扩展的Web应用 <Node.js项目实践:构建可扩展的Web应用>用专业的讲解方式 ...

最新文章

  1. 如何得到iterator的当前元素_链表进化!双向链表+迭代器(Iterator)!
  2. 看懂mysql执行计划--官方文档
  3. 【转载】OmniGraffle (四)化繁为简
  4. dqn在训练过程中loss越来越大_DQN算法实现注意事项及排错方法
  5. linux var 空间不足,/var空间不足怎么办?(求安全保险的方法)
  6. C#LeetCode刷题之#671-二叉树中第二小的节点(Second Minimum Node In a Binary Tree)
  7. typedef四用途与两陷阱
  8. 列举一台微型计算机的常用硬件,电脑基础知识问答卷
  9. 前端date format_前端面试-手撕代码篇
  10. Linux之shell编程基础
  11. 图像处理-图像尺寸变换
  12. scratch好书推荐
  13. 倾斜摄影实景三维与游戏的结合
  14. .bat 常用命令
  15. 【顺序、分支、循环、子程序设计】—— 微机原理实验
  16. 中年男人失业,滴滴,外卖,保安三选一,怎么选?
  17. 徐州市纳西科技贸易有限公司 拖欠工资 李东来
  18. 计算机数字顺序怎么带公式,Excel函数公式:6个数据排序技巧,总有一个适合你!...
  19. iOS 关于leak检测内存问题的使用
  20. 青年APP大赛陕西省复赛 收获

热门文章

  1. 图像处理之Lanczos采样放缩算法
  2. 培智儿童的计算机教育,特殊教育学校计算机信息技术教学的几点做法
  3. 《大侦探福尔摩斯2:诡影游戏》蓝光高清720P 1080P下载[2011最新动作]
  4. 工作6年多的码农ios职位面试总结(续)
  5. 我参加 NVIDIA Sky Hackathon---语音识别+前端设计
  6. RKMEDIA--AI/AO的使用
  7. word2vec-google code
  8. linux后台挂起、恢复进程相关命令
  9. xingtai - 学习九九乘法表和皇帝的米粒
  10. 545day(jquery-ajax-event.html)