企业门户定制网站建设公司创意字体logo设计免费
2026/4/6 6:53:26 网站建设 项目流程
企业门户定制网站建设公司,创意字体logo设计免费,万网域名查询工具,企业解决方案中的关键点#x1f342; 枫言枫语#xff1a;我是予枫#xff0c;一名行走在 Java 后端与多模态 AI 交叉路口的研二学生。 “予一人以深耕#xff0c;观万木之成枫。” 在这里#xff0c;我记录从底层源码到算法前沿的每一次思考。希望能与你一起#xff0c;在逻辑的丛林中寻找技术…枫言枫语我是予枫一名行走在 Java 后端与多模态 AI 交叉路口的研二学生。“予一人以深耕观万木之成枫。”在这里我记录从底层源码到算法前沿的每一次思考。希望能与你一起在逻辑的丛林中寻找技术的微光。在 Java 面试或者研读源码时你一定会被问到ReentrantLock是怎么实现的CountDownLatch为什么能让线程等待这些看似功能迥异的组件其实背后都指向了同一个名字——AQS。今天我来带大家拆解这个 Doug Lea 大神留下的神作。一、 AQS 到底是什么AQS全称AbstractQueuedSynchronizer抽象队列同步器。简单来说它是一个框架。它把实现一个锁或同步器最繁琐的工作比如线程排队、线程阻塞与唤醒、CAS 操作状态等全部封装好了。你只需要在这个框架的基础上填入一点点关于“如何获取锁”和“如何释放锁”的业务逻辑就能造出一把功能完备的锁。形象比喻自动化的银行柜台想象一个只有一个柜台的银行State状态柜台是否有人0 表示空闲1 表示有人。CAS客户尝试冲向柜台的动作。CLH 队列没抢到柜台的人自觉去排队。AQS 框架银行的自动排队机和叫号系统。它负责维护队列并在柜台空闲时叫醒下一个人。二、 AQS 的“三大支柱”要理解 AQS必须死磕这三个核心组成部分1. 状态位volatile int state这是 AQS 的核心。所有的同步状态都靠它。在ReentrantLock中state表示锁的持有次数0 为空闲1 为被占用1 为重入次数。在Semaphore中state表示剩余的可用许可数。在CountDownLatch中state表示还需要等待的计数。注意state是被volatile修饰的保证了多线程下的可见性。2. CAS (Compare And Swap)AQS 频繁使用 CAS 指令来修改state的值。这是实现“无锁化”或“轻量级锁”的关键。只有 CAS 成功的线程才算真正拿到了锁。3. CLH 变体队列双向链表当线程抢锁失败时AQS 会将其封装成一个Node节点并放入一个双向链表中。头节点 (Head)正在持有锁的那个线程。后续节点正在苦苦等待被唤醒的线程。三、 AQS 的两种工作模式AQS 设计最精妙的地方在于它同时支持两种模式独占模式 (Exclusive)一次只能有一个线程持有锁。如 ReentrantLock。共享模式 (Shared)允许多个线程同时获取。如 Semaphore信号量、ReadLock读锁、CountDownLatch。这种“一套框架两样通吃”的设计体现了极高的抽象能力。四、 源码级流程一个线程的“抢锁之旅”我们以ReentrantLock.lock()为例看看 AQS 内部发生了什么第一步acquire(1)线程尝试获取锁。调用tryAcquire(1)。这个方法是由具体的子类如NonfairSync实现的。如果成功CAS 修改 state 从 0 变 1 成功直接开干。第二步addWaiter(Node.EXCLUSIVE)如果tryAcquire失败了AQS 会把当前线程包装成一个Node塞进队列的尾部。这里用到了“自旋 CAS”来保证线程安全地入队。第三步acquireQueued(node, 1)这是最精彩的部分。线程入队后不会立即睡觉挂起而是会再看一眼“我的前驱节点是不是头节点”如果是说明快轮到我了再试一次tryAcquire。如果不是或者再次尝试也失败了那就调用LockSupport.park(this)心安理得地阻塞休眠。五、 为什么 AQS 这么快自旋优化线程在进入阻塞状态前会进行少量的自旋尝试减少了内核态和用户态切换的开销。双向链表便于取消某个排队节点比如等待超时的线程只需要修改前后指针即可。模板方法模式AQS 定义了骨架复杂的线程调度逻辑由 AQS 处理子类只需关心简单的状态修改逻辑。六、 给“予枫”读者的总结AQS 的精髓在于它通过一个volatile状态位和一个高效的 FIFO 队列完美地解决了多线程抢占资源的冲突问题。如果你在准备面试记住这几个关键词volatile state、CAS、双向 CLH 队列、LockSupport。下一步建议单纯看博文是不够的。建议你打开 IntelliJ IDEA输入ReentrantLock顺着lock()方法点进去看看那个叫Sync的内部类你会发现它真的继承了AbstractQueuedSynchronizer关于作者 予枫某高校在读研究生专注于 Java 后端开发与多模态情感计算。欢迎点赞、收藏、评论你的反馈是我持续输出的最大动力我的博客即将同步至腾讯云开发者社区邀请大家一同入驻https://cloud.tencent.com/developer/support-plan?invite_code9wrxwtlju1l当前加入还有惊喜相送

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询