AQS(AbstractQueuedSynchronizer,抽象队列同步器)在JDK1.5中由Doug Lea实现,它也是JUC包的底层基石,是一套用来实现锁、同步器的模板框架。1、重识AQS我们常见的几个类,如ReentrantLock、Semaphore和CountDownLatch,它们表面上功能各不相同,但是它们的核心设计都是基于AQS实现的,那么什么是AQS呢?通过一个简答的生活中例子来说明,如下图所示:假设我们去一些政府机构办理业务,假设今天只有一个柜台对外开放并且柜台前有一个等候区,这里就类似我们的AQS的核心模型,在AQS中的state类似柜台的状态private volatile int state;AQS内部的state变量,我们可以把它想象成柜台叫号机,当state=0表示柜台空闲状态,此时柜台资源可用提供服务,此时叫号机呼叫用户A上来办理业务;当用户A在办理业务的时候,此时state=1,表示柜台有人在办理业务,后续的用户需要等待用户A办理业务结束。 用户A办理业务中,其他的用户只能在等候区排队,类比AQS,等候区这就是AQS中CLH队列(双向等待队列),如下图所示:CLH队列是一个双向的链表,每个排队的线程都被封装成一个Node对象,CLH队列中是先进先出机制。AQS中线程完整的流程如下图所示:当一个线程A过来的时候,线程A检查state是不是0,如果是0表示线程A获取到了锁,此时立马把state改成1,然后开始执行业务逻辑;如果state是1,表示线程A获取锁失败,此时线程A打包成一个Node然后去CLH队列队尾排队。2、AQS的设计Java并发包的作者Doug Lea设计的非常优秀,他把AQS中state和队列这2个东西抽出来放在父类里,这是经典的模板方法设计模式,如下图所示:AQS作为父类,它把最通用的活全部做好了,如线程的排队、入队、出队、阻塞线程和唤醒线程这些非常复杂的逻辑都写好了,这样子类如ReentrantLock,它只需要实现一些最简单的逻辑,如修改state的值,子类只需要实现tryAcquire()尝试获取,使用tryRelease()尝试释放,子类使用这两个方法就能修改state的值。 同样使用AQS作为父类,ReentrantLock和CountDownLatch实现了不同功能:(a)ReentrantLock独占所,它的规则是:我占了别人就不能占有,所以他的tryAcquire()逻辑是只要state是0,表示线程就可以抢到了锁,然后将state值改成1,这样别人就无法再抢到锁。(b)CountDownLatch共享锁,它的规则是:它的逻辑是只有当state减到了0,所有的线程才能一起通过。我们都知道,没有拿到锁的线程会在队列中等待获取锁,那么排在队列中的线程是在“死循环”空转?其实,在队列中这些线程它们都在睡眠挂起状态,使用到了一个秘密大武器,即就是LockSupport.park(),当线程需要等待时,AQS会调用这个方法,此时它不是空转,而是直接向操作系统发指令,核心的内容是:“请把这个线程挂起,暂时不要给它分配任何CPU时间片”。然后使用LockSupport.unpark(thread),当锁被释放时,持有锁的线程会调用这个方法,“唤醒"队列中的下一个等待线程。这种线程调度由操作系统内核完成,几乎不消耗CPU资源。3、AQS加锁到释放的全过程(1)线程A到来的时候,首先拿到state=0,抢到锁后设为state=1,开始执行自己的业务逻辑(2)线程B到了,检查state的时候,发现state=1,自己不能抢到锁。(3)AQS把线程B打包成node放到队列里(4)AQS调用LockSupport.park(), 线程B在队列中处于睡眠状态。(5)线程A执行完自己的业务逻辑后,将state改成0(6)AQS发现队列里还有等待执行任务的线程,于是调用LockSupport.unpark(thread)(7)线程B被唤醒后,拿到state=0,设置state=1,开始执行自己的业务逻辑。总结:(1)AQS用state标识是否可以获取锁(state=0标识可以获取锁),用CLH队列存放无法获取锁的线程等待区(2)AQS用了模板方法模式,实现了父类管排队,子类管规则(3)AQS用了LockSupport.park()和LockSupport.unpark(thread)来实现高效的线程阻塞和唤醒。学AI大模型的正确顺序,千万不要搞错了🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
AQS(AbstractQueuedSynchronizer,抽象队列同步器)在JDK1.5中由Doug Lea实现,它也是JUC包的底层基石,是一套用来实现锁、同步器的模板框架。1、重识AQS我们常见的几个类,如ReentrantLock、Semaphore和CountDownLatch,它们表面上功能各不相同,但是它们的核心设计都是基于AQS实现的,那么什么是AQS呢?通过一个简答的生活中例子来说明,如下图所示:假设我们去一些政府机构办理业务,假设今天只有一个柜台对外开放并且柜台前有一个等候区,这里就类似我们的AQS的核心模型,在AQS中的state类似柜台的状态private volatile int state;AQS内部的state变量,我们可以把它想象成柜台叫号机,当state=0表示柜台空闲状态,此时柜台资源可用提供服务,此时叫号机呼叫用户A上来办理业务;当用户A在办理业务的时候,此时state=1,表示柜台有人在办理业务,后续的用户需要等待用户A办理业务结束。 用户A办理业务中,其他的用户只能在等候区排队,类比AQS,等候区这就是AQS中CLH队列(双向等待队列),如下图所示:CLH队列是一个双向的链表,每个排队的线程都被封装成一个Node对象,CLH队列中是先进先出机制。AQS中线程完整的流程如下图所示:当一个线程A过来的时候,线程A检查state是不是0,如果是0表示线程A获取到了锁,此时立马把state改成1,然后开始执行业务逻辑;如果state是1,表示线程A获取锁失败,此时线程A打包成一个Node然后去CLH队列队尾排队。2、AQS的设计Java并发包的作者Doug Lea设计的非常优秀,他把AQS中state和队列这2个东西抽出来放在父类里,这是经典的模板方法设计模式,如下图所示:AQS作为父类,它把最通用的活全部做好了,如线程的排队、入队、出队、阻塞线程和唤醒线程这些非常复杂的逻辑都写好了,这样子类如ReentrantLock,它只需要实现一些最简单的逻辑,如修改state的值,子类只需要实现tryAcquire()尝试获取,使用tryRelease()尝试释放,子类使用这两个方法就能修改state的值。 同样使用AQS作为父类,ReentrantLock和CountDownLatch实现了不同功能:(a)ReentrantLock独占所,它的规则是:我占了别人就不能占有,所以他的tryAcquire()逻辑是只要state是0,表示线程就可以抢到了锁,然后将state值改成1,这样别人就无法再抢到锁。(b)CountDownLatch共享锁,它的规则是:它的逻辑是只有当state减到了0,所有的线程才能一起通过。我们都知道,没有拿到锁的线程会在队列中等待获取锁,那么排在队列中的线程是在“死循环”空转?其实,在队列中这些线程它们都在睡眠挂起状态,使用到了一个秘密大武器,即就是LockSupport.park(),当线程需要等待时,AQS会调用这个方法,此时它不是空转,而是直接向操作系统发指令,核心的内容是:“请把这个线程挂起,暂时不要给它分配任何CPU时间片”。然后使用LockSupport.unpark(thread),当锁被释放时,持有锁的线程会调用这个方法,“唤醒"队列中的下一个等待线程。这种线程调度由操作系统内核完成,几乎不消耗CPU资源。3、AQS加锁到释放的全过程(1)线程A到来的时候,首先拿到state=0,抢到锁后设为state=1,开始执行自己的业务逻辑(2)线程B到了,检查state的时候,发现state=1,自己不能抢到锁。(3)AQS把线程B打包成node放到队列里(4)AQS调用LockSupport.park(), 线程B在队列中处于睡眠状态。(5)线程A执行完自己的业务逻辑后,将state改成0(6)AQS发现队列里还有等待执行任务的线程,于是调用LockSupport.unpark(thread)(7)线程B被唤醒后,拿到state=0,设置state=1,开始执行自己的业务逻辑。总结:(1)AQS用state标识是否可以获取锁(state=0标识可以获取锁),用CLH队列存放无法获取锁的线程等待区(2)AQS用了模板方法模式,实现了父类管排队,子类管规则(3)AQS用了LockSupport.park()和LockSupport.unpark(thread)来实现高效的线程阻塞和唤醒。学AI大模型的正确顺序,千万不要搞错了🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】