调用Condition的await()方法(或者以await开头的方法),会使当前线程进入等待队列并释放锁,同时线程状态变为等待状态。当从await()方法返回时,当前线程一定获取了Condition相关联的锁

public final void await() throws InterruptedException { if (Thread.interrupted()) //表示await允许被   中断 throw new InterruptedException(); Node node = addConditionWaiter(); //创建一个  新的节点,节点状态为condition,采用的数据结构仍然是链表 int savedState = fullyRelease(node); //释放当前的锁,得到锁的状态,并唤醒AQS队列中的一个线程 int interruptMode = 0; //如果当前节点没有在同步队列上,即还没有被signal,则将当前线程阻塞 while (!isOnSyncQueue(node)) {//判断这个节点是否在AQS队列上,第一次判断的是false,因为前面已经释放锁了 LockSupport.park(this); //通过park挂起当前线程 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) break; } // 当这个线程醒来,会尝试拿锁, 当 acquireQueued 返回 false 就是拿到锁了. // interruptMode != THROW_IE -> 表示这个线程没有成功将 node 入队,但 signal 执行了 enq 方法让其入队了. // 将这个变量设置成 REINTERRUPT. if (acquireQueued(node, savedState) && interruptMode != THROW_IE) interruptMode = REINTERRUPT; // 如果 node 的下一个等待者不是 null, 则进行清理,清理 Condition 队列上的节点. // 如果是 null ,就没有什么好清理的了. if (node.nextWaiter != null) // clean up if cancelled unlinkCancelledWaiters(); // 如果线程被中断了,需要抛出异常.或者什么都不做 if (interruptMode != 0) reportInterruptAfterWait(interruptMode);
}

condition.await相关推荐

  1. Thread.sleep() / Object.wait() / Condition.await() / LockSupport.park() / LockSupport.unpark() 区别

    转自:https://www.cnblogs.com/tong-yuan/p/11768904.html Thread.sleep()和Object.wait()的区别 首先,我们先来看看Thread ...

  2. 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列

    目录 简介 一对一生产和消费:一只母鸡和叫练 wait/notify Lock条件队列 多对多生产和消费:2只母鸡和叫练/叫练媳妇 wait/notifyAll Lock条件队列 Lock和synch ...

  3. Condition总结-await和signal的总结

    我把前面的整个分解的图再通过一张整体的结构图来表述,线程awaitThread先通过lock.lock()方法获取锁成功后调用了condition.await方法进入等待队列,而另一个线程signal ...

  4. Java并发编程,Condition的await和signal等待通知机制

    Condition简介 Object类是Java中所有类的父类, 在线程间实现通信的往往会应用到Object的几个方法: wait(),wait(long timeout),wait(long tim ...

  5. 【并发编程系列6】Condition队列原理及await和singal(等待/唤醒)机制源码分析

    Condition队列原理分析 前言 初识Condition Condition使用示例 Condition原理分析 condition.wait()源码解读 AQS#await() AQS#addC ...

  6. ReentrantLock中的Condition(等待和唤醒)

    Condition 类的 awiat 方法和 Object 类的 wait 方法等效 Condition 类的 signal 方法和 Object 类的 notify 方法等效 Condition 类 ...

  7. java lock condition_Java 通过 Lock 和 竞争条件 Condition 实现生产者消费者模式

    更多 Java 并发编程方面的文章,请参见文集<Java 并发编程> 竞争条件 多个线程共享对某些变量的访问,其最后结果取决于哪个线程偶然在竞争中获胜. condition.await() ...

  8. zbb20180929 thread java并发编程之Condition

    java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...

  9. Java多线程编程笔记之Condition

    本篇内容基于JDK7,涉及Condition常用方法. 1.概述 Condition接口位于java.util.concurrent.locks包下,实现类有 AbstractQueuedLongSy ...

最新文章

  1. 9.3 域名解析与网页爬虫
  2. make时候说找不到makefile_找不到答案的时候,就去看一看这个世界
  3. 从零开始Bootstrap3
  4. Hadoop 系列之 Hive
  5. 可重复锁ReentrantLock原理分析
  6. OpenAI公布强化学习新算法,可控制复杂机器人
  7. Ajax无刷新数据绑定
  8. python脚本画pie饼图_小白学Python(11)——pyecharts,绘制饼图 Pie
  9. 简单迭代法和牛顿迭代法matlab程序设计(含例题)
  10. Java对接ChinaPay提现(公私钥方式)
  11. Excel改变照片底色,设置为白色
  12. CentOS7安装Chrome浏览器
  13. MapReduce作业运行机制
  14. 5万款Lr顶级调色预设合集,精心整理,分类清晰,摄影师调色师必备素材,够用一辈子
  15. 电脑更换硬盘应该注意什么?
  16. wishbone协议(B.3)下载地址
  17. ZCU104开发板:开发板组件描述
  18. RT-Thread 嵌入式人工智能教学在线研讨会,就在本周六!
  19. JSONObject 的清除
  20. Android Q行为变更

热门文章

  1. 入门Java菜鸟,JDK和Eclipse的安装一定要知道
  2. Linux下C语言的文件操作
  3. arm-none-eabi-gcc install
  4. java utils
  5. UVALive 7143 Room Assignment(组合数学+DP)(2014 Asia Shanghai Regional Contest)
  6. 快速解码base64和utf-8的ASCII编码和URL解码
  7. NSDate根据日期获得当前是周几,以及一年内的第几周,以及一个月内得第几周...
  8. ADO的几种数据库连接方式
  9. 我国物流业的国际比较及发展措施 (1)
  10. 并发编程之Synchronized