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

本文共 1858 字,大约阅读时间需要 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解析

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.200.74.241]2022年05月27日 17时29分22秒

关于作者

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

最新文章

斐波那契数列 线性dp 2019-07-23 23:57:28
upc bus 线性dp 2019-07-23 23:57:27
upc 奇怪的道路 分形之城---改版 2019-07-23 23:57:27
upc 艰难取舍 最长上升子序列 2019-07-23 23:57:26
upc 工作团队 并查集 + 虚父节点 2019-07-23 23:57:26
最后一次新生赛 B+C+D 2019-07-23 23:57:25
upc 马拉松比赛 dp 2019-07-23 23:57:25
upc 地球发动机 线性dp + 二分 2019-07-23 23:57:24
upc 电话网络 二分+最短路 2019-07-23 23:57:23
upc 结队 并查集+数学 2019-07-23 23:57:23
upc 考试 离散化+差分 2019-07-23 23:57:22
upc 魔法阵 2019-07-23 23:57:22
upc 走迷宫 bfs 2019-07-23 23:57:21
upc 生命曲线 线段树+lazy 2019-07-23 23:57:20
组装玩具 贪心||二分 2019-07-23 23:57:19
统计序列 2019-07-23 23:57:19
游戏智商 动规 2019-07-23 23:57:18
Codeforces Eugene and an array 2019-07-23 23:57:17
upc 真假鉴定 思维+模拟 2019-07-23 23:57:17
玉米田 组合数学 环涂色 2019-07-23 23:57:16