同步器AQS中的同步队列与等待队列
在单纯地使用锁,比如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中的同步队列与等待队列相关推荐
- AQS独占式同步队列入队与出队
入队 Node AQS同步队列和等待队列共用同一种节点结构Node,与同步队列相关的属性如下. prev 前驱结点 next 后继节点 thread 入队的线程 入队节点的状态 INITIAl 0 初 ...
- AQS理解之七——AQS中的条件队列
AQS中的条件队列 在AQS中还实现了一个类,ConditionObject,它实现了Condition接口,实现一个绑定在锁上的条件队列. 先看看他的uml图. 主要方法 它实现了Condition ...
- 死磕Java并发:J.U.C之AQS:CLH同步队列
本文转载自公号:Java技术驿站 在上篇文章"死磕Java并发:J.U.C之AQS简介"中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列. CLH同步队列是一个F ...
- 浅谈AQS(AbstractQueuedSynchronizer,同步队列)
1.1 同步队列:队列中存放排队等待锁的线程,每个线程放入队列时会被包装为Node类,如下图. 1.2 抢锁:调用lock方法,如果抢锁成功(CAS成功,或者是重入--state计数加1),那么in ...
- 【死磕Java并发】-----J.U.C之AQS:CLH同步队列
原文出处:https://www.cmsblogs.com/category/1391296887813967872 『chenssy』 在上篇博客[死磕Java并发]-----J.U.C之AQS:A ...
- 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?
文章目录 1.阻塞队列简介 2. BlockingQueue源码分析 3. 生产者消费者模型如何保证信息不会丢失? 1.阻塞队列简介 1.1 什么是阻塞队列? 阻塞队列是一个队列 ①:当队列是空的,从 ...
- java clh队列_J.U.C|同步队列(CLH)
一.写在前面 在上篇我们聊到AQS的原理,具体参见<J.U.C|AQS原理>. 这篇我们来给大家聊聊AQS中核心同步队列(CLH). 二.什么是同步队列(CLH) 同步队列 一个FIFO双 ...
- java同步队列_Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理
前言 在 Java 中通过锁来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关 ...
- 并发编程-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 ...
最新文章
- 一个中国人看了爽的笑话
- python panda读取csv_python pandas 中文件的读写——read_csv()读取文件
- python网页保存为图片_使用Python保存网页上的图片或者保存页面为截图
- 估计很多前端都没学过单元测试~
- GOOGLE搜索出来的你的网站说明是乱码的
- Android 功耗(20)---Android后台调度与省电
- 如何将vs2015中的英文注释改为中文
- pythonwhile循环love_while循环简介
- C/C++变量在内存中的位置及初始化问题
- 网格搜索、随机搜索和贝叶斯调参总结与python代码实践
- python在电力系统中的应用_PyPSA在电力系统潮流计算中的应用
- TCP/IP框架总结
- 分布式服务架构原理、设计
- Linux之sqlite3使用
- 06-图3 六度空间
- java短信接口_短信接口-- java
- 微信小程序、微信低版本兼容
- C语言如何求出一堆整数的最大值
- androidlib.java_实现 Java SDK 库
- Win11玩不了红警怎么办?Win11玩不了红警解决方法分享
热门文章
- 我的世界工业服务器发展最快,《我的世界》中国版服务器快速发展攻略 发展思路及心得分享...
- 简单:C语言连接俩个字符串
- 微信属于计算机软件的应用软件吗,微信解封软件是不是真的 微信解封软件有用吗...
- AM调制的FPGA实现
- windows出现蓝屏解决方法
- 基于Aidlux的人体识别、人体追踪与人数统计获取
- 订阅号助手APP怎么插入留言板小程序?
- unity之StartCoroutine运行机制--懵逼了
- 【Windows10】电脑副屏的指示箭头是什么?
- 广电总局:每集电视剧不得以任何形式插播广告