并发编程复习(五):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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.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
当下热点词再学:redis缓存预热、更新、降级,限流
2019-04-27
【redis6.0.6】redis源码慢慢学,慢慢看 -- 第五天:adlist
2019-04-27
别抖,OK? 操作系统抖动现象、网络抖动与延迟、函数抖动之防抖与节流,串讲
2019-04-27
通过域名获取主机IP -- struct addrinfo
2019-04-27
【C++】算法集锦(8):从两数和问题拓展到一百数和问题
2019-04-27