AQS: 什么是AQS?
AQS定义了一套多线程访问共享资源的同步器框架. 许多同步类实现都依赖于它,如常用的ReentrantLock/ReentrantReadWriterLock/CountDownLatch
这些类里面都维护了一套aqs的子类,利用子类实现的功能。该队列里面维护的是一堆线程节点。
核心思想是当前线程获取锁的时候如果失败了,就被加入到阻塞队列中(fifo双向队列)配合锁一起使用的。
主要关注getstate().setstate(),compareandsetstate(int expect,int update)
当状态值为0的时候说明没有线程获取锁,否则有线程获取锁,在此当中在判断是不是当前线程,(可重入锁的特性)
可重入锁可以设置公平锁和非公平锁,
非公平锁需要进行2次的cas然后在进入队列,公平锁是看一下对列里面是否有排队的线程,有的话直接添加到队列的尾部排队。
CountDownLatch 调用 await() 方法时,先去获取 state 的值,当计数器不为0的时候,说明还有需要等待的线程在运行,则调用 doAcquireSharedInterruptibly 方法,进来执行的第一个动作就是尝试加入等待队列 ,即调用 addWaiter()方法,await() 方法是线程阻塞,直到计数器为0,才会启动;
如何设置和怎么实现的参见:https://zhuanlan.zhihu.com/p/45305463;
参照:https://www.cnblogs.com/waterystone/p/4920797.html;http://ifeve.com/java-special-troops-aqs/
总结:aqs理解原理就行了,因为了它与锁的结合已经帮我们默认实现了内部机制,无需关心它。
AQS: 什么是AQS?的更多相关文章
- AQS 原理以及 AQS 同步组件总结
1 AQS 简单介绍 AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面. AQS 是一个用来构建锁和同步 ...
- AQS原理以及AQS同步组件总结
1 AQS简单介绍 2 AQS原理
- 构建锁与同步组件的基石AQS:深入AQS的实现原理与源码分析
Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock.Semaphore,它们的实现都用到了一个共同的基类--AbstractQueuedS ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 获取文件的缩略图Thumbnail和通过 AQS - Advanced Query Syntax 搜索本地文件
演示如何获取文件的缩略图 FileSystem/ThumbnailAccess.xaml <Page x:Class="XamlDemo.FileSystem.ThumbnailAcc ...
- JUC回顾之-AQS同步器的实现原理
1.什么是AQS? AQS的核心思想是基于volatile int state这样的volatile变量,配合Unsafe工具对其原子性的操作来实现对当前锁状态进行修改.同步器内部依赖一个FIFO的双 ...
- Java并发编程总结3——AQS、ReentrantLock、ReentrantReadWriteLock(转)
本文内容主要总结自<Java并发编程的艺术>第5章——Java中的锁. 一.AQS AbstractQueuedSynchronizer(简称AQS),队列同步器,是用来构建锁或者其他同步 ...
- 重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件
原文:重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件 [源码下载] 重新想象 Windows 8 Store Apps ( ...
- 深入浅出AQS之组件概览
之前分析了AQS中的独占锁,共享锁,条件队列三大模块,现在从结构上来看看AQS各个组件的情况. 原文地址:http://www.jianshu.com/p/49b86f9cd7ab 深入浅出AQS之独 ...
随机推荐
- main:处理命令行选项
#include<iostream> #include<stdlib.h> using namespace std; int main(int argc, char** arg ...
- Mysql :分支结构—if函数
一分支结构 1.if函数 功能:实现简单的双分支 语法: IF (表达式1,表达式2,表达式3) 执行顺序 如果表达式1成立 则if函数返回表达式2的值,否则返回表达式3的值 应用: 任何地方
- Kaggle: House Prices: Advanced Regression Techniques
Kaggle: House Prices: Advanced Regression Techniques notebook来自https://www.kaggle.com/neviadomski/ho ...
- POJ 3994:Probability One
Probability One Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1674 Accepted: 1151 D ...
- mysql与mariadb性能测试方法
本方法来自于阿里云的MySQL性能白皮书,原文地址:https://help.aliyun.com/document_detail/35264.html?spm=a2c4g.11174359.6.77 ...
- Vulkan 开发学习资料汇总
开发资料汇总 1.API Reference 2.Vulkan Spec 有详细说明的pdf 文章 1.知乎Vulkan-高性能渲染 2.Life of a triangle - NVIDIA's l ...
- Pandas_one-hot encoding与dummy encoding
Pandas_特征编码 one-hot encoding 基本思想是将离散型特征的每一种取值都看成一种状态,保证每一个取值只会使得一种状态处于激活状态. 编码函数pd.get_dummies() du ...
- mysql第三篇:表操作
第三篇:表操作 一.什么是表 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 二.创建表 语法 CREATE TABLE 表名( 字段名1 类型 ...
- 如何利用vue脚手架创建一个vue项目
1.安装node.js 2.打开命令行查看下npm和node是否都安装好 node -v npm -v 3.安装淘宝镜像cnpm $ npm install -g cnpm --registry=ht ...
- POJ 1840:Eqs 哈希求解五元方程
Eqs Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14169 Accepted: 6972 Description ...