Java面试必问题目:AQS原理深度剖析,看完吊打面试官!

Java AQS底层原理:面试深度解析(附实战避坑) 摘要: Java并发面试核心难点AQS(AbstractQueuedSynchronizer)是ReentrantLock等并发工具的基础实现,采用"共享状态变量+双向阻塞队列"机制。公平锁通过hasQueuedPredecessors()保证排队顺序,非公平锁直接CAS抢锁性能更高。加锁流程包含tryAcquire、入队和阻塞等待三阶段,解锁时通过tryRelease和唤醒后继节点完成。 阅读详情

大家好,我是小马哥。最近并发编程是大厂面试中重点考察的问题。今天我们来探讨一下AQS相关的面试技巧。毕竟此类问题回答的好坏会在很大程度上影响我们面试的得分。

1. AQS在java中的使用

给代码加锁,是java中处理并发问题的重要手段。

java中的很多锁都是基于抽象类AQS(AbstractQueuedSynchronizer)实现的。

如下表所示:

2. AQS的实现机制

AQS提供了实现锁的机制,即CLH队列,同时通过ConditionObject实现了条件等待链表。

其中CLH队列如下:

  1. AQS使用 private volatile int state; 表示同步状态

  2. 通过内置的FIFO队列完成线程的排队

  3. 使用CAS对state进行修改。

3. AQS主要方法

AQS对外提供的用于实现锁的方法如下:

基于AQS可以实现公平锁和非公平锁,互斥锁和共享锁。

4. ReentrantReadWriteLock

ReentrantReadWriteLock中的写锁实现了互斥锁,读锁实现了共享锁。

其中写锁的互斥性,用于保证不会并发执行写操作,保证了数据的一致性。

其中读锁的共享性,确保可以多线程同时读取,提升了读的优先级,对于读操作执行逻辑较重的场合,比较合适。

在抢锁的时候,只有一个写线程可以抢锁成功,但同时可能有多个读线程抢锁成功,由于读写互斥,容易引起读线程“饿死”的情况。

4.1. 互斥锁

写线程通过调用WriteLock的lock方法来获取互斥锁。

java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock#lock

 public void lock() {
     sync.acquire(1);
 }

java.util.concurrent.locks.AbstractQueuedSynchronizer#acquire

该方法首先尝试获取锁,如果获取失败,就将当前线程封装为Node对象,追加到CLH队列中,休眠,等待抢锁。

 public final void acquire(int arg) {
     if (!tryAcquire(arg) &&
         acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
         selfInterrupt();
 }

之所以称为互斥锁,是因为该方法向CLH队列添加的节点是单个节点,只封装了一个线程。

关于互斥锁的获取流程,感兴趣的小伙伴可以加微信 Geanmingti 索取。

4.2. 共享锁

读操作通过调用读写锁ReadLock的lock来获取共享锁。

java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock#lock

 public void lock() {
     sync.acquireShared(1);
 }

java.util.concurrent.locks.AbstractQueuedSynchronizer#acquireShared

该方法首先尝试获取共享锁,如果抢锁失败,则执行线程节点入CLH队列的操作。

 public final void acquireShared(int arg) {
     if (tryAcquireShared(arg) < 0)
         doAcquireShared(arg);
 }

之所以称为共享锁,是因为在该方法中,会判断CLH队列尾节点是互斥操作还是共享操作,如果是互斥操作,则当前线程节点追加到尾节点后面;如果是共享操作,则通过引用,挂到尾节点的横向链表上,当获取锁的时候,横向链表中的节点线程一并获取到锁。

关于共享锁的获取流程,感兴趣的小伙伴可以加微信 Geanmingti 索取。

5. ReentrantLock

ReentrantLock实现了公平锁和非公平锁。

5.1. 抢锁操作

java.util.concurrent.locks.ReentrantLock#lock

该方法用于获取互斥锁。

 public void lock() {
     sync.acquire(1);
 }

java.util.concurrent.locks.AbstractQueuedSynchronizer#acquire

上述方法调用了AQS的acquire方法,用于获取锁,该方法首先尝试获取锁,如果获取锁失败,就将当前线程封装为Node接待,追加到CLH队列中。

 public final void acquire(int arg) {
     if (!tryAcquire(arg) &&
         acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
         selfInterrupt();
 }

上述方法中的tryAcquire方法,该方法调用了ReentrantLock内部类Sync的实现。

Sync类有两个子类,分别是FairSync和NofairSync。其中FairSync实现了公平锁功能,NonfairSync实现了非公平锁的功能。

5.2. 公平锁

当前线程在抢锁的时候,先判断CLH队列中有没有其他线程在等待获取锁,如果没有,再去抢锁。如果有,则乖乖排队:

 protected final boolean tryAcquire(int acquires) {
     final Thread current = Thread.currentThread();
     int c = getState();
     if (c == 0) {
         // 如果没有前置节点等待抢锁,才去抢
         if (!hasQueuedPredecessors() &&
             compareAndSetState(0, acquires)) {
             setExclusiveOwnerThread(current);
             return true;
         }
     }
     // ......

关于公平锁的获取流程,感兴趣的小伙伴可以加微信 Geanmingti 索取。

5.3. 非公平锁

tryAcquire方法的实现如下,该方法调用了nonfairTryAcquire方法用于实现非公平抢锁。

java.util.concurrent.locks.ReentrantLock.NonfairSync#tryAcquire

 protected final boolean tryAcquire(int acquires) {
     // 非公平尝试获取锁
     return nonfairTryAcquire(acquires);
 }

下面方法中,表示没有线程持有锁,不管是否有线程在等待,直接抢,非公平。

 final boolean nonfairTryAcquire(int acquires) {
     final Thread current = Thread.currentThread();
     int c = getState();
 ​
     if (c == 0) {
         if (compareAndSetState(0, acquires)) {
             setExclusiveOwnerThread(current);
             return true;
         }
     }
     // ......

关于非公平锁的获取流程,感兴趣的小伙伴可以加微信 yuer900411_sky 索取。

关于如何学习Java,一方面需要不断的去学习,把基础知识学扎实,另一方面也要认识到java的学习不能仅仅靠理论,更多的是靠实操,所以要多练习多做项目,在实践中学习才是最好的学习方法。很多人刚开始不知道怎么去学习,那么我这里有一套Java2021最新1000道面试pdf总结,不怕面试被问到,私我获取哦

50道Java经典面试题总结 (1)Semaphore 同步器特征:经典的信号量,通过计数器控制对共享资源的访问Semaphore(int count): 创建拥有 count 个许可证的信号量acquire()/acquire(int num) : 获取 1/num 个许可证release/release(int num) : 释放 1/num 个许可证(2)CountDownLatch 同步器特征:必须发生指定数量的事件后才可以继续运行 (比如赛跑比赛,裁判喊出 3,2,1 之后大家才同时跑) 阅读详情

相关推荐

AQS(AbstractQueuedSynchronizer) 面试题的代码解析,涵盖核心原理和常见面试考点

CLH队列:双向链表实现公平等待,节点状态(waitStatus)控制唤醒逻辑,核心是“FIFO”原则;state管理volatile保证可见性,CAS保证原子修改,不同组件通过state语义差异化实现功能;两种模式独占模式:实现tryAcquiretryRelease(如共享模式:实现(如阻塞与唤醒:依赖unpark(),通过节点状态(SIGNAL)协调唤醒时机;条件队列Condition对应独立单向链表,await()转移到条件队列,signal()转移回同步队列,需持有锁才能操作。

你是人间四月天 741

3.Java面试题之AQS

AQS(AbstractQueuedSynchronizer)是Java并发包(java.util.concurrent)中的一个抽象类,用于实现同步器(如锁、信号量、栅栏等)。AQS提供了一种基于FIFO队列的机制来管理线程的竞争和等待状态。其主要作用是简化同步器的实现,通过提供通用的同步状态管理和线程排队机制,使得开发者可以专注于特定同步器的逻辑。了解AQS的工作原理和应用场景是高级Java开发者需要掌握的重要技能。以下是一些常见的AQS面试题及其详细解答。

前端、移动端、后端源码级底层原理分享 2874

NX二次开发(python)-坯料尺寸(一)

一般在产品制造过程中,往往要判断一个模型在出模方向上的最小包容盒尺寸,在NX中可以用坯料尺寸命令实现,当然也有相应的代码实现,这或许可以帮助我们实现一些产品的坯料尺寸批量输出,节省人力。

dasfanfan的博客 816

Java面试--AQS

AQS

小刺猬 5562

VerilogEval实战指南:从基准测试到模型微调的全流程解析

本文提供了VerilogEval实战指南,详细解析了从基准测试到模型微调的全流程。VerilogEval是一个自动化、标准化的测试框架,用于客观评估大语言模型生成Verilog硬件代码的能力。文章涵盖了环境搭建、核心机制解析、利用其生成合成数据进行模型微调的策略,以及如何将其工程化集成到自动化评估流程中,为硬件设计领域的AI应用提供了完整的方法论。

yy01234的博客 1004

SGM5860x高精度ADC驱动开发与SPI接口实战指南

本文详细介绍了SGM5860x高精度ADC芯片的驱动开发与SPI接口配置实战。内容涵盖芯片特性、SPI通信设置、寄存器映射、驱动初始化、数据采集处理、校准优化及调试技巧,帮助开发者快速掌握国产24位ADC的应用,提升工业测量项目的精度与稳定性。

vvv99的博客 713

【技术百宝囊】收藏系列,高手过招的600余套外功招数,内功心法和实战精髓 l 持续更新

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

2401_84585339的博客 924

Labview执行adbshell操作

一、目录 1、实现思路 2、adbshell工具配置 3、Labview执行命令窗口 1、实现思路 使用Labview的优点: 1、可以配合电源系统或者调用其他接口工具实现更高程度的自动化测试; 2、直接执行Linux相关命令,编写相关执行顺序或者逻辑更简易; --------可以用adbpush命令将.sh的脚本文件推入控制器内部执行; 3、Ubuntu系统比较大,如果只是日常执行脚本测试还是比较占用磁盘空间; 2、adbshell工具配置 1)下载adbshell工具; adbshell工具下载链

zataji的博客 2052

AQS详解(JAVA面试高频题)

AQS 是一个抽象队列同步器,位于包下的。主要用来构建锁和同步器,许多同步类实现都依赖于它,如ReentrantLock、ReentrantReadWriteLock、Semaphore,CountDownLatch等。。

O(∩_∩)O哈哈~ 692

lammps案例:热导率模拟案例讲解(NEMD方法)

lammps计算热导率大体可以分为三种方法:EMD、NEMD、rNEMD。 本文介绍非平衡模拟(NEMD)热导率的计算方法。 NEMD下热导率计算公式为: k=dQ*dZ/dt k:热导率 dQ:能量通量。 dT/dZ:温度梯度。 非平衡态下计算热导率的原理是在材料的两端或者中间设置热源和冷源。 在热源输入热量,在冷源抽取等量的热量,在这个过程中计算材料内部会有热量的传递,产生温度梯度。 在lammps模拟中得到能量通量和温度梯度,代入公式即可求得热导率。 热量的输入方式有多种,如fix langevin

lammps_jiayou的博客 1万+

扫码登录原理

扫码登录功能通过PC端与移动端的交互实现安全认证,分为三个阶段:待扫描阶段生成唯一二维码ID并轮询状态;已扫描阶段移动端提交token与二维码ID关联,生成临时token并要求用户确认;确认阶段验证临时token后为PC端生成正式登录凭证。整个过程通过二维码唯一性、状态轮询和二次确认机制确保安全性,防止未授权登录,最终完成跨设备认证流程。

阿杰同学的博客 344

AQS原理剖析

并发编程是大厂面试中重点考察的问题。 此类问题回答的好坏会在很大程度上影响我们面试的得分。 1. AQS在java中的使用 给代码加锁,是java中处理并发问题的重要手段。 java中的很多锁都是基于抽象类AQS(AbstractQueuedSynchronizer)实现的。 如下表所示: 同步工具 同步工具与AQS的关联 ReentrantLock 使用AQS保存锁重复持有的次数。当一个线程获取锁时,ReentrantLock记录当前获得锁的线程标识,用于检测是否重复获取.

jzf2003428036的专栏 353

Ansible 面板工具之AWK ( Anssible Tower )界面介绍

整理这部分笔记博文内容为AWX和UI 界面的简单介绍理解不足小伙伴帮忙指正傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波这里AWX使用的是最新的版本AWX 21.7.0目前最新版是3.8.6,博客中的版本为3.5.0对于Redhat的,官网上看到在 2022 年 11 月之后不在维护了,改版之后现在叫,感兴趣小伙伴可以了解下虽然有AWX是。

山河已无恙 1303

java八股文面试[多线程]——AQS 详细介绍

只有当state大于0的时候,阻塞的线程才能继续执行,此时先前执行任务的线程继续执 行release方法,release方法使得state的变量会加1,那么自旋的线程便会判断成功。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障 拦截的线程才会继续干活。所以当 N 个线程都调 用了这个方法,count 的值等于 0,然后主线程就能通过 await() 方法,恢复执行自己的任务。相对来说,非公平锁会有更好的性能,因为它的吞吐量比较大。

u200814342A的博客 841

CloudCompare 二次开发(35)——提取多条直线

使用CloudCompare与PCL编程实现的多条空间直线的提取。

点云侠的博客 437

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

2024年JAVA面试题,终于整理完了

AQS是一个抽象类,可以用来构造锁和同步类,如ReentrantLock,Semaphore,CountDownLatch,CyclicBarrier。AQS的原理是,AQS内部有三个核心组件,一个是state代表加锁状态初始值为0,一个是获取到锁的线程,还有一个阻塞队列。当有线程想获取锁时,会以CAS的形式将state变为1,CAS成功后便将加锁线程设为自己。当其他线程来竞争锁时会判断state是不是0,不是0再判断加锁线程是不是自己,不是的话就把自己放入阻塞队列。这个阻塞队列是用双向链表实现的。

2301_78976656的博客 1576

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java高频面试之--- AQS原理解析

什么是AQS?AQS有什么用呢? 本篇文章主要就是解决这两个问题,并且附上源码解析。 AQS 的全称是 AbstactQueuedSynchronizer 即抽象队列同步器。 可能大部分使用Java语言的同学都知道它,因为他是面试的高频问题之一,面试Android也会问这样的问题,我自己就被问了好几次。 java并发包下很多API都是基于AQS来实现的加锁和释放锁等功能的,AQS是java并发包的...

zhujiangtaotaise的专栏 6364

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JAVA面试题|AQS详细剖析

JAVA基础篇面试题 文章目录JAVA基础篇面试题1. 线程等待唤醒的实现方法2. 介绍一下LockSupport3. AQS是什么4. AQS的核心原理5. 公平锁与非公平锁的区别6. 请讲述非公平锁加锁解锁的具体流程 1. 线程等待唤醒的实现方法 Object对象中的wait()方法可以让线程等待,使用Object中的notify()方法唤醒线程; 必须都在同步代码块内使用; 调用wait,notify的对象是加锁对象; notify必须在wait后执行才能唤醒; wait后能释放锁对象,线程处

qq_37419449的博客 1万+

Java高并发核心:AQS原理与面试必考点解析

文章深入解析Java高并发核心机制AQS(AbstractQueuedSynchronizer)的工作原理,从锁的状态管理、队列结构到加锁与释放流程逐一剖析,并结合实际案例讲解如何自定义同步器。此外,文章还总结了AQS在面试中的必考点,包括线程协调机制、公平锁与非公平锁的区别以及常见问题的解决方案,帮助读者全面掌握这一高并发核心技术,轻松应对技术面试挑战...

yanpeng2580的博客 664

Java并发面试题:(八)AQS原理和Semaphore、CountdownLatch、CyclicBarrier类

通过维护一个共享资源状态( Volatile Int State )和一个先进先出( FIFO )的线程等待队列来实现一个多线程访问共享资源的同步框架。AQS队列同步器(AbstractQueuedSynchronizer),是用来构建锁或者其他同步组件的基础框架。它使用了一个int的成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。

weixin_42774617的博客 285

Java高级面试必问:AQS 到底是什么?

/ 一个简单的"最多允许N个线程访问"的自定义锁public class SimpleLimitLock { private final Sync sync;// 初始化状态为允许的最大线程数 protected int tryAcquireShared(int acquires) { int available = getState();

sjkflw121150的博客 390

Java多线程面试题:Java中的AQS是什么?它的工作原理是什么?解释Java中的Fork/Join框架,解释Java中的原子数组在并发编程中的应用

关注点:考察对AQS(AbstractQueuedSynchronizer)的理解,以及它在并发编程中的应用。考察方向:理解AQS的设计原理,以及如何使用它来构建自定义的同步器。具体原理AQS是一个用于构建锁和其他同步组件的框架,它内部维护了一个volatile int state变量和一个FIFO队列来管理等待的线程。AQS提供了两种同步模式:独占模式和共享模式。独占模式下,一次只有一个线程可以访问资源;共享模式下,多个线程可以同时访问资源。实操问题请给出一个使用AQS实现自定义锁的示例。

码农超哥的博客 844

面试系列Java中级:谈谈AQS的原理

面试系列Java中级:谈谈AQS的原理

CancerKing的博客 468

【面试题】AQS -- 共享模式

只有一个线程能执行,如 ReentrantLock。

yzx3105的博客 1219

(四)【Java精选面试题】AQS底层架构设计原理(含答案)

目录1. 谈谈Lock锁底层实现原理2. synchronized与lock锁之间区别3. 谈谈LockSupport的用法4. AQS核心参数有哪些呢5. Lock锁基本实现原理6. Semaphore信号量底层原理7. CountDownLatch底层原理 1. 谈谈Lock锁底层实现原理 底层基于AQS+Cas+LockSupport锁实现 2. synchronized与lock锁之间区别 Lock基于AQS封装的锁,结合 CAS实现,而Lock锁的升级过程需要自己实现; Synchronized

记录各种Bug解决案例及日常学习内容 1846
上一篇: 8年的Java后台开发,为什么 还不知道分布式限流?看完涨薪翻倍了
下一篇: 三分钟了解Java“锁”事,进大厂不难!
84696zuoguwz
博客等级 码龄5年 12粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值