场景引入

    面试官上来就一句,谈谈你对AQS的理解,大家心里可能收到了1W点伤害,AQS是什么,可能连全称都不知道,所以下面让我们聊聊AQS。  

  以ReentrantLock来介绍一下AQS

    在java中,用java并发包下的ReentrantLock来加锁和释放锁,是个什么样的感觉呢?

 ReentrantLock  lock=new ReentrantLock();
lock.lock();
try { }catch (Exception ex){ }
finally {
lock.unlock();
System.out.println("测试");
}

    上面那段代码,无非就是一个锁的对象,然后加锁和释放锁。

    你可能会问:这个和AQS有啥关系,关系大了去了,因为Java 并发包下,很多API都是基于AQS来实现加锁和释放锁的功能的,AQS是Java 并发包的基础。

    AQS的全称是:AbstractQueuedSynchronizer,抽象队列同步器,给大家画一张图,看看,ReentrantLock和AQS的之间的关系。

    

    ReentrantLock里面包含了一个AQS对象,这个AQS对象是ReentrantLock可以实现加锁和释放锁的关键性核心组件。

  ReentrantLock加锁和释放锁的底层原理

    如果一个线程尝试用ReentrantLock的lock方法来进行加锁,会发生什么事情呢?

    这个AQS对象内部有一个核心变量叫做state,是int类型的并且还是volatile的,初始状态这个state的值是0。

    另外AQS内部还有一个关键变量,用来记录当前加锁的是哪个线程,初始荒唐下这个变量是null。

    

    接着线程1跑过来调用ReentrantLock的lock方法进行加锁,这个加锁的过程,直接就是将CAS的state从0变成1。

    如果之前没加过锁,那么state值是0,此时线程1是可以加锁成功的。

    一旦线程1,加锁成功之后,就把当前加锁线程设置为自己。下面这张图就是线程1的加锁过程。

    其实看到这里,大家对AQS应是有感觉了的,就是并发包里面的一个核心组件,里面维护有state变量,加锁线程变量等核心东西,维护了加锁状态。

    ReentrantLock这种东西只是也给外层的API,内核中的锁机制都是依赖AQS组件的。

    除此之外,AQS内部还维护着一个先进先出的等待队列,因为如果线程2这个时候来加锁,就会加锁失败,所以AQS还有维护一个等待队列,专门来存放那些加锁失败的线程。

    ReentrantLock是可重入锁,知道了state变量和当前加锁线程是谁之后,就可以很容易实现可重复进入的锁了。

    如果线程1,在完成自己的业务逻辑代码之后,就会释放锁,他释放锁的过程非常简单,就是将AQS内的State变量的值递减1,如果state值为0,就彻底释放锁了,会将加锁线程也变为null。

    这就是AQS的整个过程。

  总结

    AQS是一个并发包的基础组件,用来实现各种锁,各种同步组件,它包含state变量,加锁线程,等待队列等并发中的核心组件。

    

     

                

聊聊你对AQS的理解的更多相关文章

  1. AQS简单理解入门---1

    这篇文章,我们来聊聊面试时一个比较有杀伤力的问题:聊聊你对AQS的理解? 之前有同学反馈,去互联网公司面试,面试官聊到并发时就问到了这个问题.当时那位同学内心估计受到了一万点伤害... 因为首先,很多 ...

  2. 【面试普通人VS高手系列】谈谈你对AQS的理解

    AQS是AbstractQueuedSynchronizer的简称,是并发编程中比较核心的组件. 在很多大厂的面试中,面试官对于并发编程的考核要求相对较高,简单来说,如果你不懂并发编程,那么你很难通过 ...

  3. 并发系列3-大白话聊聊Java并发面试问题之谈谈你对AQS的理解?【石杉的架构笔记】

  4. Java并发面试问题,谈谈你对AQS的理解

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  5. 对于AQS的理解

    1.JUC包中的 CountDownLatch.CyclicBarrier.ReentrantLock和Semaphore都是基于AQS(AbstractQuenedSynchronizer)实现的 ...

  6. 聊聊ReentrantLock基于AQS的公平锁和非公平锁的实现区别

    ReentrantLock锁的实现是基于AQS实现的,所以先简单说下AQS: AQS是AbstractQueuedSynchronizer缩写,顾名思义:抽象的队列同步器,它是JUC里面许多同步工具类 ...

  7. java并发:AQS的简单理解

    简介: AQS全称 AbstractQueuedSynchronizer,提供了一个基于FIFO(先进先出)队列,可以用于构建锁或者其他相关同步装置的基础框架. ReentrantLock.Semap ...

  8. AQS源码的简单理解

    概念 AQS全称 AbstractQueuedSynchronizer. AQS是一个并发包的基础组件,用来实现各种锁,各种同步组件的.它包含了state变量.加锁线程.等待队列等并发中的核心组件. ...

  9. 从ReentrantLock实现非公平锁的源码理解AQS中的CLH队列

    虽然前面也看过AQS的文章,并且转载过一篇大佬的分析,但是我觉得他们对于AQS和ReentrantLock部分的源码的分析并不详细,自己理解期来还是有问题,于是自己准备花时间重新梳理下,好了,进入正题 ...

随机推荐

  1. VUE3 之 组件间事件通信 - 这个系列的教程通俗易懂,适合新手

    1. 概述 相关定律告诉我们:这个世界上的任何事物之间都会存在一定联系,"城门失火,殃及池鱼"就是一个很好的例子.因此如果我们能够尽早发现这些看不见的联系,就能很好的解决更多遇见的 ...

  2. 数据库查询语句遇到:Unknown column 'XXXX' in 'where clause'解决方法

    数据库查询语句遇到:Unknown colunm 'XXX' in 'where clause'解决方法 根本原因:可能是sql语句所用到的数据类型错误(int与String)弄错- 我的情况: 在网 ...

  3. 第06讲:Flink 集群安装部署和 HA 配置

    Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...

  4. 删除修改docker网络环境

    安装工具包 yum install bridge-utils -y 设置docker0 ip网段 ip link set docker0 down brctl delbr docker0 brctl ...

  5. NOIP2018 Day2T2 填数游戏

    下面先给出大家都用的打表大法: 首先我们可以发现 \(n \le 3\) 的情况有 \(65pts\),而 \(n\) 这么小,打一下表何乐而不为呢?于是我写了一个爆枚每个位置再 \(check\) ...

  6. 记一次.net core 异步线程设置超时时间

    前言: 刷帖子看到一篇 Go 记录一次groutine通信与context控制 看了一下需求背景,挺有意思的,琢磨了下.net core下的实现 需求背景: 项目中需要定期执行任务A来做一些辅助的工作 ...

  7. github中,一些涉及到用户配置的文件怎么处理(比如数据库用户名/密码)?

    感谢问题回答者:Livid 问题地址:https://www.v2ex.com/t/74245 加密方式参考:http://www.manongjc.com/detail/12-bmntimjowei ...

  8. git命令log与reflog的比较

    感谢原文作者:杨鲜生 原文链接:https://blog.csdn.net/u013252047/article/details/80230781 用git命令,想看到自己的操作记录,则可以使用log ...

  9. Eclipse不能启动,提示:The Eclipse executable launcher was unable to locate its companion launcher jar

    原因分析:JDK版本与eclipse不匹配 如jdk和eclipse版本号必须统一,64位都是64位,32位都是32位. jdk版本可以用命令,cmd进入命令窗口,然后输入java -version, ...

  10. xargs、sort、uniq命令

    xargs.sort.uniq命令,我们由LeetCode的一道题来引入,并使用加以理解: 题目是这样的:写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率. word ...