并发编程复习(五):CountDownLatch
发布日期:2021-11-13 10:21:44 浏览次数:17 分类:技术文章

本文共 2056 字,大约阅读时间需要 6 分钟。

今天主要基于上一节的文章,其实这两张连起来是阿里的一道面试题。上一节我们说明了notify不能释放锁,那么怎么能做到及时通知呢?这时就可以用concurrent包下的一个同步工具类:CountDownLatch。

代码说明:

import java.util.ArrayList;import java.util.List;import java.util.concurrent.CountDownLatch;/** * 注意:wait方法是释放锁的,notify方法不会释放锁 * @author lihao * */public class MyThread6 {	private volatile List list = new ArrayList<>();	private static CountDownLatch downLatch = new CountDownLatch(1);	public void add() {		list.add("主席");	}	public int getSize() {		return list.size();	}	public static void main(String[] args) {		MyThread6 myThread6 = new MyThread6();		 //Object obj = new Object();		Thread thread = new Thread(new Runnable() {			@Override			public void run() {				//synchronized (obj) {					for(int i=0;i<10;i++){						myThread6.add();						System.out.println("线程" + Thread.currentThread().getName() + "添加了一个元素");						try {							Thread.sleep(1000);							if (myThread6.getSize() == 5) {								System.out.println("发出通知");								//obj.notifyAll();								downLatch.countDown();							}						} catch (InterruptedException e) {							// TODO Auto-generated catch block							e.printStackTrace();						}					}				//}							}		},"t1");		Thread thread2 = new Thread(new Runnable() {			@Override			public void run() {				//synchronized (obj) {											if(myThread6.getSize()!=5){							try {								//obj.wait();								downLatch.await();							} catch (InterruptedException e) {								// TODO Auto-generated catch block								e.printStackTrace();							}						}						System.out.println("收到通知");						throw new RuntimeException();									//}			}		});		thread2.start();		thread.start();	}}
输出结果:

线程t1添加了一个元素线程t1添加了一个元素线程t1添加了一个元素线程t1添加了一个元素线程t1添加了一个元素发出通知Exception in thread "Thread-0" 线程t1添加了一个元素收到通知java.lang.RuntimeException	at cn.lh.bf.MyThread6$2.run(MyThread6.java:64)	at java.lang.Thread.run(Thread.java:745)线程t1添加了一个元素线程t1添加了一个元素线程t1添加了一个元素线程t1添加了一个元素
你会发现代码还变简单了,那么CountDownLatch这个类到底是什么意思呢?

你会发现在构造函数中我们传递了一个int数值,其实这个类就像一个计数器,每次调用

downLatch.countDown();
方法会将我们构造时的int值减一操作,当该值为0时会立即唤醒所有使用downLatch.await();等待的线程。

综上:其实为阿里的一道面试题,谢谢大家

转载地址:https://blog.csdn.net/Lee_Ho_/article/details/78054904 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:并发编程复习(六):使用wait和notify模拟阻塞队列
下一篇:并发编程复习(四):wait和notify解析

发表评论

最新留言

不错!
[***.144.177.141]2024年04月16日 21时42分55秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【C++】攻克哈希表(unordered_map) 2019-04-27
转:【答学员问】- 该如何根据岗位学习相关技能 2019-04-27
转:【答学员问】有什么经验教训,是你在面试很多次之后才知道的? 2019-04-27
消息队列:解耦、异步、削峰,现有MQ对比以及新手入门该如何选择MQ? 2019-04-27
【奇技淫巧】-- 三角形最小路径和 2019-04-27
【小技巧】argc和argv的用法 2019-04-27
学不下去了怎么办? 2019-04-27
二叉树的前中后序遍历(迭代法)(带动画) 2019-04-27
【小技巧】【XShell】【Xftp】Windows桌面与Linux虚拟机互传文件 2019-04-27
【redis入门】Centos下安装redis 2019-04-27
【redis入门】redis安装后相关知识串讲 2019-04-27
【redis】来吧,展示一下redis 发布-订阅模式 2019-04-27
讲通C/C++预编译/条件编译指令 #ifdef,#ifndef,#endif,#define,… 2019-04-27
【redis6.0.6】redis源码慢慢学,慢慢看 -- 第二天:空间配置(zmalloc) 2019-04-27
当下热点词再学:redis缓存预热、更新、降级,限流 2019-04-27
【redis6.0.6】redis源码慢慢学,慢慢看 -- 第五天:adlist 2019-04-27
别抖,OK? 操作系统抖动现象、网络抖动与延迟、函数抖动之防抖与节流,串讲 2019-04-27
第六天:网络处理(anet部分)-- redis源码慢慢学,慢慢看【redis6.0.6】 2019-04-27
通过域名获取主机IP -- struct addrinfo 2019-04-27
【C++】算法集锦(8):从两数和问题拓展到一百数和问题 2019-04-27