并发之AQS
AQS 完整流程图 核心笔记一、AQS 核心结构AQS state(同步状态) CLH 双向队列 LockSupport二、AQS 加锁流程图最关键线程开始 ↓ 判断 state 是否为 0 ↓ 是 → CAS 尝试将 state 0 → 1 ↓ 成功 → 获取锁成功设置当前线程为持有线程 ↓ 失败 / state 不为 0 ↓ 判断是否是**可重入**当前线程 持有线程 ↓ 是 → state重入成功 ↓ 否 → 封装成 Node 节点加入**CLH 队列尾部** ↓ 调用 LockSupport.park() → 线程阻塞 ↓ 等待前一个线程唤醒三、AQS 解锁流程图持有锁线程执行完毕 ↓ state 0释放锁 ↓ 唤醒队列中**第一个等待节点** ↓ 被唤醒线程尝试 CAS 获取锁 ↓ 获取成功 → 成为新的锁持有者 ↓ 原节点移除队列四、AQS 完整流程总图极简版┌─────────────┐ │ 新线程尝试加锁 │ └───────┬─────┘ ↓ ┌─────────────┐ │ state 0 ? │ └───┬─────────┬───┘ │ 是 │ 否 ↓ ↓ ┌──────────┐ ┌───────────────────┐ │ CAS 成功 │ │ 封装Node → 入队 → park阻塞 │ └───┬──────┘ └──────────┬────────┘ │ │ ↓ ↓ ┌──────────────┐ ┌───────────────┐ │ 获取锁成功 │ │ 等待前驱节点唤醒 │ └──────────────┘ └────────┬──────┘ │ ┌────────────────────────────┴─────────┐ │ 释放锁state0 │ │ 唤醒后继节点 │ └────────────────────┬─────────────────┘ ↓ 被唤醒线程重新竞争锁五、AQS 核心关键词背会面试满分state锁状态0无锁≥1有锁CAS无锁竞争修改 state 专用CLH 队列抢不到锁的线程排队,特点先进先出park / unpark阻塞与唤醒Node队列里的线程节点独占/共享两种同步模式六、一句话记住 AQS抢不到就入队入队就阻塞释放就唤醒唤醒再抢锁CAS 改状态队列来排队
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2478846.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!