了解Condition

JDK1.5中引入了java.util.concurrent.locks.Condition接口,用来替代wait/notify。wait/notify大家应该很了解,主要用来解决多线程的协调问题(等待/通知),但是其存在如下几个问题:

早唤醒问题:wait/notify是依赖Object+synchronized来实现,如果存在多个线程wait(),那么通过notify()方法只能唤醒一个线程,而且这个线程不一定是我们想要唤醒的线程,导致运行错误。如果通过notifyAll()方法唤醒,那么所有线程都会唤醒,就会存在不想唤醒的线程被唤醒,导致不必要的线程上下文切换,这也就是早唤醒问题。Object.wait(long)是否为超时唤醒问题。Object.wait(long)方法可能是通过notify唤醒也可能是超时唤醒,但是无法通过这方法区分。JUC中的Condition中await()、signal()、signalAll()分别对应Object中的wait()、notify()、notifyAll()方法。但是Condition更加灵活,并且解决了上述两个问题。

Condition的使用

代码第二部分

代码第二部分

运行结果

如代码所示,Condition实例通过Lock.newCondition()方法创建。Object.wait()/notify()要求其执行线程必须持有这些方法所属对象的内部锁,Condition也类似,其需要执行线程持有创建该Condition实例的显示锁(lock)。不同的是lock可以创建多个Condition,用来实现不同类型/条件的线程的等待/通知。如示例代码,NotifyThreadA类型线程通过conditionA实例仅仅用来通知WaitThreadA类型线程。如果使用Object.wait()/notify()只能通知所有持有该对象内部锁且处于wait状态的线程,无法按分类/条件唤醒。

Condition作用

第一节已经说明了,Condition解决wait/notify存在的两个问题,在这一节我们总结一下Condition是如何解决这两个问题的。

解决早唤醒问题:Condition可以通过Lock.newCondition()方法创建多个Condition实例,来实现不同类型/条件线程的等待/唤醒,所以只要使用合理,就不会存在通知到不应该通知的线程而导致的线程资源竞争和不必要的线程上下文切换。Object.wait(long)是否为超时唤醒问题:Condition中提供了awaitUntil(Date)方法,这个方法可以用于实现带超时时间限制的等待,其返回一个boolean值用来区分是等待超时还是被通知唤醒的。true表示被通知唤醒,false表示等待超时唤醒。总结:目前实际应用中推荐使用Condition来代替wait/notify。

参考

《Java多线程实战指南(核心篇)》第五章——线程间协作

END

笔者是一位热爱互联网、热爱互联网技术、热于分享的年轻人,如果您跟我一样,我愿意成为您的朋友,分享每一个有价值的知识给您。喜欢作者的同学,点赞+转发+关注哦!

java多线程条件变量_30秒带你读懂Java并发包工具(JUC)之Condition(并发条件变量)...相关推荐

  1. 简单一文带你读懂Java变量的作用和三要素

    Java变量的作用 不只是java,在其他的编程语言中变量的作用只有一个:存储值(数据) 在java中,变量本质上是一块内存区域,数据存储在java虚拟机(JVM)内存中 变量的三要素 变量的三要素分 ...

  2. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  3. 一文带你读懂Java字节码

    文章目录 前言 准备事宜 1 下载UltraEdit 下载Java虚拟机规范(Java SE 8版) 一.生成字节码 二.字节码阅读 class文件总览 魔数与副主版本号 常量池 字段 方法 统一讲解 ...

  4. 1.6 万字长文带你读懂 Java IO

    Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 N ...

  5. 窥一斑而知全豹,几分钟带你读懂Java字节码,再也不怕了

    目录 1.如何看字节码 2.一个简单的例子 3.字节码结构 4.总结: 引言:都知道java的源文件最后会被编译成class文件,class文件的内容是字节码.为什么java要编译成字节码呐?我觉得最 ...

  6. 带你读懂Java GC日志信息 教你如何使用工具查看【图文演示】

    文章目录 一.常见参数列表 二.设置参数位置 三.参数设置演示 四.日志补充说明 五.工具查看日志 一.常见参数列表 1.目的:通过阅读GC日志,我们可以了解Java虛拟机内存分配与回收策略. 2.内 ...

  7. java内存屏障详解_一文读懂Java关键词之volatile作用(内存屏障)

    之前在一篇文章中跟大家一同学习了CPU缓存一致性,通过缓存一致性协议MESI我们可以让CPU各个计算核心中缓存的数据保持一致,避免造成计算结果的差异. 我们还知道Java内存模型中,各个线程还保存了一 ...

  8. java 源码系列 - 带你读懂 Reference 和 ReferenceQueue

    java 源码系列 - 带你读懂 Reference 和 ReferenceQueue https://blog.csdn.net/gdutxiaoxu/article/details/8073858 ...

  9. java byte char io流_一文带你看懂JAVA IO流,史上最全面的IO教学

    原标题:一文带你看懂JAVA IO流,史上最全面的IO教学 一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符 ...

  10. java io流详解_一文带你看懂JAVA IO流,史上最全面的IO教学啦

    一.IO流是什么 惯例引用百科的回答流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作 ...

最新文章

  1. Spreadsheet Tracking
  2. 客户机服务器文件更新,服务端数据更新,如何更新客户端缓存
  3. 计算机考研计划时间,2019计算机考研时间安排:复习时间规划
  4. 腾讯被深圳南山法院强制执行:执行标的25元;B站就招聘争议致歉;华为云回应是否将独立运作|极客头条...
  5. mcp证书有什么用_初级会计职称有什么用?考下证书可以做什么工作?
  6. android api接口封装,android-apidesigner是一个网络接口封装工具
  7. 细胞亚器文献阅读之酵母液泡与线粒体的动态互作A Dynamic Interface between Vacuoles and Mitochondria in Yeast
  8. cmd下运行Oracle清屏命令
  9. 联想服务器加装显卡无显示,Lenovo双显卡机型安装显卡驱动方案汇总
  10. 《西窗法雨》一天读完,怕不怕
  11. IT职业技能图谱:IT工程师学习路线
  12. windows 服务器cpu使占用高的原因分析与解决办法
  13. 闲人博上介绍R语言的一篇好文章
  14. 网易开源的分布式存储系统 Curve 正式成为 CNCF 沙箱项目
  15. PDF编辑方法,怎么从PDF中提取页面
  16. python画图皮卡丘_用python画一只可爱的皮卡丘
  17. IO模块软件处理方案
  18. 以下代码可以屏蔽掉alt+f4
  19. android 九宫格图片选择(微信朋友圈) 图片预览 (底部recycleview 不卡顿)
  20. python期货外盘不间断交易_外盘期货模拟交易【最新版】_数据API_数据应用_股票行情接口/API-云市场-阿里云...

热门文章

  1. 一个根据SortOrder控制排序的存储过程
  2. 4.软件架构设计:大型网站技术架构与业务架构融合之道 --- 操作系统
  3. 5.性能之巅 洞悉系统、企业与云计算 --- 应用程序
  4. 3.Linux/Unix 系统编程手册(上) -- 系统编程概念
  5. 26. 安全 HTTP
  6. 洛谷 P4568 [JLOI2011]飞行路线
  7. MySQL · 引擎特性 · 基于InnoDB的物理复制实现(转载)
  8. 【语言学习】Java
  9. weblogic启动失败:Could not obtain the localhost address 解决办法
  10. 使用jQuery插件filtrify实现的超酷动态标签分类摩托车新款展示