一、condition和对象监视器

Condition是对象监视器的替代品,拓展了监视器的语义。

  1. 相同:
    都有一组类似的方法:
对象监视器: Object.wait()、Object.wait(long timeout)、Object.notify()、Object.notifyAll()。
Condition对象: Condition.await()、Condition.awaitNanos(long nanosTimeout)、Condition.signal()、Condition.signalAll()。

都需要和锁进行关联:

对象监视器: 需要进入synchronized语句块(进入对象监视器)才能调用对象监视器的方法。
Condition对象:需要和一个Lock绑定。
  1. 不同:
    Condition拓展的语义方法:
awaitUninterruptibly():等待时忽略中断
awaitUntil(Date deadline) throws InterruptedException:等待到特定日期

使用方法:

对象监视器: 进入synchronized语句块(进入对象监视器)后调用Object.wait()。
Condition对象: 需要和一个Lock绑定,并显示的调用lock()获取锁,然后调用 Condition.await()。

等待队列数量:

对象监视器: 1个。
Condition对象: 多个。通过多次调用lock.newCondition()返回多个等待队列。

二、Condition接口

  1. 声明
  2. 等待方法
    不管是发生中断还是超时都将继续竞争锁,而不是立即返回,只有再次获取锁时才能从等待方法返回(这一点和Object等待方法语义是一致的),根据中断状态抛出异常。
  3. 通知方法

三、Condition接口使用示例

官方文档里举了一个和ArrayBlockingQueue的功能相似的有界塞队列例子,接下来分析一下

  1. 定义
  2. put方法
  3. get方法

    总结:
    在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现,这里注意,Condition是被绑定到Lock上的,要创建一个Lock的Condition必须用newCondition()方法。Condition的强大之处在于,对于一个锁,我们可以为多个线程间建立不同的Condition。如果采用Object类中的wait(), notify(), notifyAll()实现的话,当写入数据之后需要唤醒读线程时,不可能通过notify()或notifyAll()明确的指定唤醒读线程,而只能通过notifyAll唤醒所有线程,但是notifyAll无法区分唤醒的线程是读线程,还是写线程。所以,通过Condition能够更加精细的控制多线程的休眠与唤醒。

重点注意一点:condition的使用必须依赖于lock对象,通过lock对象的newCondition()方法初始化一个condition对象。

本文参考

Condition接口详解相关推荐

  1. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  2. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  3. html5硬件接口,HTML5通用接口详解

    1.先说几个基本类型: DOMString, boolean, long, unsigned long, double,BmBHTML5中文学习网 - HTML5先行者学习网 NaN(Not-a-Nu ...

  4. Spring使用IOC容器创建对象及ClassPathXmlApplicationContext与FileSystemXmlApplicationContext接口详解

    IOC容器创建对象及接口详解 引言 类的建立 配置文件 IOC创建对象 运行结果 接口详解 (1)接口一`ClassPathXmlApplicationContext` (2)接口二:`FileSys ...

  5. 微信小程序和百度的语音识别接口详解

    介绍 因为项目需要,使用到了微信小程序和百度的语音接口 现在将项目中的一个小模块拿出来单独分享. 技术关键字 微微信小程序 百度语音接口 nodejs,express fluent-ffmegp 环境 ...

  6. RandomAccess接口详解

    RandomAccess接口详解 Interface RandomAccess All Known Implementing Classes: ArrayList, AttributeList, Co ...

  7. 【JavaWeb】Servlet系列——HttpServletRequest接口详解

    文章目录 23 HttpServletRequest接口详解 23.1 关于HttpServletRequest接口 23.2 HttpServletRequest接口的实现类谁写的? HttpSer ...

  8. 接口详解(JAVA)

    接口详解(JAVA) 文章目录 接口详解(JAVA) 接口 接口的定义和使用 练习 接口的细节:成员特点和接口的各种关系 接口中成员的特点 接口和类之间的关系 接口中新增方法,接口应用和适配器设计模式 ...

  9. GB28181平台对接接口详解

    28181平台对接接口详解 信令接口: 1.1 平台注册 下级平台主动向上级平台注册: 注册鉴权信息(用户名和密码)由上级提供: 举例说明: 下级--->上级 REGISTER sip:6201 ...

最新文章

  1. Spinner 使用的使用 报错:ArrayAdapter requires the resource ID to be a TextView
  2. 依赖包 全局_composer 更新指定的依赖包
  3. BCH与BCE共享比特币之名
  4. python切片语法-Python切片详解
  5. 武汉大学2010年数学分析试题解答
  6. spring源码分析之cache demo
  7. ios-NSMutableAttributedString 更改文本字符串颜色、大小
  8. OpenCV使用GDAL读取地理空间栅格文件
  9. 我和小美的撸码日记(1)之软件也需靠脸吃饭,带您做张明星脸(附后台经典框架 DEMO 下载)...
  10. winxp制作服务器,你要知道的WinXP服务器操作系统安装的方法
  11. ROS学习笔记(一)——软件版本的选择
  12. js php后端 安全,前端JS RSA加密,PHP后端解密实现密码安全传输
  13. make: ./libtool:命令未找到
  14. 微信接口java解密_微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)...
  15. 修改Dreamweaver(DW) cs6代码背景为黑色
  16. 计算机终端保密检查 玩游戏,计算机终端保密检查系统
  17. 99乘法表c语言竖坐标,99乘法表c语言(c语言九九乘法表原理)
  18. 应届毕业生怎么找java工作,应届毕业生怎么能找到高薪工作?
  19. MobaXterm SSH 保持连接
  20. C语言课程设计图书馆管理系统

热门文章

  1. 淘淘商城 @Autowired 装配失败
  2. 10.14 将n个数按输入输出顺序的逆序排列,用函数实现
  3. (mysql) EXPLAIN语法
  4. ASP.Net MVC的学习
  5. [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
  6. vaniglia 源码学习 (六)
  7. 面试中回答关于oracle数据库优化的方法
  8. SDN学习之旅-RYU笔记(1)
  9. C++去掉字符串首尾的特殊字符(比如空格)
  10. Caffe 训练时loss等于87.3365且保持不变的原因及解决方法