在单纯地使用锁,比如ReentrantLock的时候,这个锁组件内部有一个继承同步器AQS的类,实现了其抽象方法,加锁、释放锁也只是涉及到AQS中的同步队列而已,那么等待队列又是什么呢?


当使用Condition的时候,等待队列的概念就出来了。Condition的获取一般都要与一个锁Lock相关,一个锁上面可以生产多个Condition。

Condition接口的主要实现类是AQS的内部类ConditionObject每个Condition对象都包含一个等待队列。该队列是Condition对象实现等待/通知的关键。AQS中同步队列与等待队列的关系如下:

在Object的监视器模型上,一个对象拥有一个同步队列与一个等待队列,而AQS拥有一个同步队列和多个等待队列

Object的监视器模型如下:

等待

调用condition的await方法,将会使当前线程进入等待队列并释放锁(先加入等待队列再释放锁),同时线程状态转为等待状态。

从同步队列和阻塞队列的角度看,调用await方法时,相当于同步队列的首节点移到condition的等待队列中

通知

调用condition的signal方法时,将会把等待队列的首节点移到同步队列的尾部,然后唤醒该节点。
被唤醒,并不代表就会从await方法返回,也不代表该节点的线程能获取到锁,它一样需要加入到锁的竞争acquireQueued方法中去,只有成功竞争到锁,才能从await方法返回。

同步器AQS中的同步队列与等待队列相关推荐

  1. AQS独占式同步队列入队与出队

    入队 Node AQS同步队列和等待队列共用同一种节点结构Node,与同步队列相关的属性如下. prev 前驱结点 next 后继节点 thread 入队的线程 入队节点的状态 INITIAl 0 初 ...

  2. AQS理解之七——AQS中的条件队列

    AQS中的条件队列 在AQS中还实现了一个类,ConditionObject,它实现了Condition接口,实现一个绑定在锁上的条件队列. 先看看他的uml图. 主要方法 它实现了Condition ...

  3. 死磕Java并发:J.U.C之AQS:CLH同步队列

    本文转载自公号:Java技术驿站 在上篇文章"死磕Java并发:J.U.C之AQS简介"中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列. CLH同步队列是一个F ...

  4. 浅谈AQS(AbstractQueuedSynchronizer,同步队列)

    1.1 同步队列:队列中存放排队等待锁的线程,每个线程放入队列时会被包装为Node类,如下图.  1.2 抢锁:调用lock方法,如果抢锁成功(CAS成功,或者是重入--state计数加1),那么in ...

  5. 【死磕Java并发】-----J.U.C之AQS:CLH同步队列

    原文出处:https://www.cmsblogs.com/category/1391296887813967872 『chenssy』 在上篇博客[死磕Java并发]-----J.U.C之AQS:A ...

  6. 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?

    文章目录 1.阻塞队列简介 2. BlockingQueue源码分析 3. 生产者消费者模型如何保证信息不会丢失? 1.阻塞队列简介 1.1 什么是阻塞队列? 阻塞队列是一个队列 ①:当队列是空的,从 ...

  7. java clh队列_J.U.C|同步队列(CLH)

    一.写在前面 在上篇我们聊到AQS的原理,具体参见<J.U.C|AQS原理>. 这篇我们来给大家聊聊AQS中核心同步队列(CLH). 二.什么是同步队列(CLH) 同步队列 一个FIFO双 ...

  8. java同步队列_Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理

    前言 在 Java 中通过锁来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关 ...

  9. 并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍

    文章目录 J.U.C脑图 J.U.C核心AQS简介 AQS底层数据结构 AQS特点 J.U.C脑图 为了体现出AQS和线程池的重要性,上图单独将AQS和线程池拿出来了. J.U.C的构成如下: J.U ...

最新文章

  1. 一个中国人看了爽的笑话
  2. python panda读取csv_python pandas 中文件的读写——read_csv()读取文件
  3. python网页保存为图片_使用Python保存网页上的图片或者保存页面为截图
  4. 估计很多前端都没学过单元测试~
  5. GOOGLE搜索出来的你的网站说明是乱码的
  6. Android 功耗(20)---Android后台调度与省电
  7. 如何将vs2015中的英文注释改为中文
  8. pythonwhile循环love_while循环简介
  9. C/C++变量在内存中的位置及初始化问题
  10. 网格搜索、随机搜索和贝叶斯调参总结与python代码实践
  11. python在电力系统中的应用_PyPSA在电力系统潮流计算中的应用
  12. TCP/IP框架总结
  13. 分布式服务架构原理、设计
  14. Linux之sqlite3使用
  15. 06-图3 六度空间
  16. java短信接口_短信接口-- java
  17. 微信小程序、微信低版本兼容
  18. C语言如何求出一堆整数的最大值
  19. androidlib.java_实现 Java SDK 库
  20. Win11玩不了红警怎么办?Win11玩不了红警解决方法分享

热门文章

  1. 我的世界工业服务器发展最快,《我的世界》中国版服务器快速发展攻略 发展思路及心得分享...
  2. 简单:C语言连接俩个字符串
  3. 微信属于计算机软件的应用软件吗,微信解封软件是不是真的 微信解封软件有用吗...
  4. AM调制的FPGA实现
  5. windows出现蓝屏解决方法
  6. 基于Aidlux的人体识别、人体追踪与人数统计获取
  7. 订阅号助手APP怎么插入留言板小程序?
  8. unity之StartCoroutine运行机制--懵逼了
  9. 【Windows10】电脑副屏的指示箭头是什么?
  10. 广电总局:每集电视剧不得以任何形式插播广告