闭锁java_Java项目实践,CountDownLatch实现多线程闭锁
摘要
本文主要介绍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实现多线程闭锁相关推荐
- Kotlin项目实践指南(上)
关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流 ...
- 项目实践精解:C#核心技术应用开发
前 言 学习任何技术都要从基础开始,这本书就是讲解C#核心技术的基础教材.读者如果简单调研一下就不难发现,市面上最多的就是这类C#基础类教材.那么,我们还有没有必要再多写一本没有特色.枯燥乏味的书呢? ...
- Unix编程要学习的内容(2)《精通Unix下C语言与项目实践》读书笔记(12)
文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的职场感悟吧.不值钱的软件人才 精力充沛与事业成功 让系分来得更猛 ...
- python从入门到实践源代码-Python从入门到项目实践 PDF 全彩带源码版
给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.入门.项目实践方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小2.1 GB,admin编写,目前豆瓣.亚马逊.当 ...
- python项目实例源码哪里下载-Python从入门到项目实践 PDF 全彩带源码版
给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.入门.项目实践方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小2.1 GB,admin编写,目前豆瓣.亚马逊.当 ...
- SVM算法在项目实践中的应用!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:苏丽敏,Datawhale优秀学习者,北理工计算机硕士 支持向量机 ...
- SAP WM Storage Location Reference在项目实践中的使用
SAP WM Storage Location Reference在项目实践中的使用 笔者目前所在的一个项目是一个已经上了SAP系统,但是需要扩展到新工厂的项目.该项目在组织结构设计的时候,结合业务的 ...
- 学习Unix,可从事什么样的工作(1)《精通Unix下C语言与项目实践》读书笔记(3)...
<精通Unix下C语言编程与项目实践>读书笔记(new) 文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的 ...
- Node.js项目实践:构建可扩展的Web应用
2019独角兽企业重金招聘Python工程师标准>>> Node.js项目实践:构建可扩展的Web应用 <Node.js项目实践:构建可扩展的Web应用>用专业的讲解方式 ...
最新文章
- 如何得到iterator的当前元素_链表进化!双向链表+迭代器(Iterator)!
- 看懂mysql执行计划--官方文档
- 【转载】OmniGraffle (四)化繁为简
- dqn在训练过程中loss越来越大_DQN算法实现注意事项及排错方法
- linux var 空间不足,/var空间不足怎么办?(求安全保险的方法)
- C#LeetCode刷题之#671-二叉树中第二小的节点(Second Minimum Node In a Binary Tree)
- typedef四用途与两陷阱
- 列举一台微型计算机的常用硬件,电脑基础知识问答卷
- 前端date format_前端面试-手撕代码篇
- Linux之shell编程基础
- 图像处理-图像尺寸变换
- scratch好书推荐
- 倾斜摄影实景三维与游戏的结合
- .bat 常用命令
- 【顺序、分支、循环、子程序设计】—— 微机原理实验
- 中年男人失业,滴滴,外卖,保安三选一,怎么选?
- 徐州市纳西科技贸易有限公司 拖欠工资 李东来
- 计算机数字顺序怎么带公式,Excel函数公式:6个数据排序技巧,总有一个适合你!...
- iOS 关于leak检测内存问题的使用
- 青年APP大赛陕西省复赛 收获
热门文章
- 图像处理之Lanczos采样放缩算法
- 培智儿童的计算机教育,特殊教育学校计算机信息技术教学的几点做法
- 《大侦探福尔摩斯2:诡影游戏》蓝光高清720P 1080P下载[2011最新动作]
- 工作6年多的码农ios职位面试总结(续)
- 我参加 NVIDIA Sky Hackathon---语音识别+前端设计
- RKMEDIA--AI/AO的使用
- word2vec-google code
- linux后台挂起、恢复进程相关命令
- xingtai - 学习九九乘法表和皇帝的米粒
- 545day(jquery-ajax-event.html)