如何使用Latch代替wait notify来进行通知
发表于:2025-02-09 作者:千家信息网编辑
千家信息网最后更新 2025年02月09日,这篇文章将为大家详细讲解有关如何使用Latch代替wait notify来进行通知,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。/** * 曾经的面试
千家信息网最后更新 2025年02月09日如何使用Latch代替wait notify来进行通知
这篇文章将为大家详细讲解有关如何使用Latch代替wait notify来进行通知,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
/** * 曾经的面试题:(淘宝?) * 实现一个容器,提供两个方法,add,size * 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束 * * 给lists添加volatile之后,t2能够接到通知,但是,t2线程的死循环很浪费cpu,如果不用死循环,该怎么做呢? * * 这里使用wait和notify做到,wait会释放锁,而notify不会释放锁 * 需要注意的是,运用这种方法,必须要保证t2先执行,也就是首先让t2监听才可以 * * 阅读下面的程序,并分析输出结果 * 可以读到输出结果并不是size=5时t2退出,而是t1结束时t2才接收到通知而退出 * 想想这是为什么? * * notify之后,t1必须释放锁,t2退出后,也必须notify,通知t1继续执行 * 整个通信过程比较繁琐 * * 使用Latch(门闩)替代wait notify来进行通知 * 好处是通信方式简单,同时也可以指定等待时间 * 使用await和countdown方法替代wait和notify * CountDownLatch不涉及锁定,当count的值为零时当前线程继续运行 * 当不涉及同步,只是涉及线程通信的时候,用synchronized + wait/notify就显得太重了 * 这时应该考虑countdownlatch/cyclicbarrier/semaphore * @author mashibing */package yxxy.c_019;import java.util.ArrayList;import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;public class MyContainer5 { // 添加volatile,使t2能够得到通知 volatile List lists = new ArrayList(); public void add(Object o) { lists.add(o); } public int size() { return lists.size(); } public static void main(String[] args) { MyContainer5 c = new MyContainer5(); //门闩(当这个1变成0的时候,这个门闩就开了) CountDownLatch latch = new CountDownLatch(1); new Thread(() -> { System.out.println("t2启动"); if (c.size() != 5) { try { //门闩等待不需要锁定任何对象 latch.await(); //也可以指定等待时间 //latch.await(5000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("t2 结束"); }, "t2").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e1) { e1.printStackTrace(); } new Thread(() -> { System.out.println("t1启动"); for (int i = 0; i < 10; i++) { c.add(new Object()); System.out.println("add " + i); if (c.size() == 5) { // 打开门闩,让t2得以执行 latch.countDown(); } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1").start(); }}
关于如何使用Latch代替wait notify来进行通知就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
线程
门闩
方法
通信
两个
个数
元素
内容
容器
文章
时候
时间
更多
知识
篇文章
结果
循环
输出
不错
繁琐
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器托管价钱
flink可以替代图数据库么
软件开发报告文档
mac网络安全密钥是什么
用编写程序软件开发效率最高
汽车行业软件开发书籍
无线网络技术规划书
绿盟下载软件开发
华夏银行软件开发经理
郑州直播软件开发怎么收费
服务器最强cpu
数据库封锁的类型
碑林软件开发报价
数据库多对多
根据数据存放点数据库分为
铜川数据库修复
服务器安装discuz
吉林警校网络安全专业
数据库服务端连接池配置参数
网络安全等级保护网网址
php如何获取数据库的数据
开发网络安全技术产品
怀化串口服务器价格
软件注册码服务器
淘宝连接服务器错误怎么办
九神经服务器
计算机网络技术职高试题
华为服务器bios
做软件开发步骤
服务器日常安全检查项