1 AQS 宏观认识一下 核心思想 如果共享资源空闲 设置为有效线程 如果被占用 进入队列等待
单向列表 效果不好 于是用了双向列表 这个列表 叫 CLH
1 sync queue 同步队列
2 condition queue 非必须 单向队列 只有用到 new Condition() 才会出现的队列 班长等人走完 才锁门
3 state 状态 只有三个位置 可以改 getState() setState() CAS
4 addWaiter 独占模式 获取资源 拿锁成功 true 失败 走5
5 addWaiter 添加到不为空的 clh
6 accquireQueued获取资源 等待被唤醒
Aqs 实现细节 现在想拿锁的 都在队列 但是 只有head-Node直接的后续节点 才有资格去尝试一下
ReentRantLock 锁重入原理 就是 cas 把state +1 变为2 +1 变为三 但是一定切记 最后state最后一点更要是0 不然无法释放
aqs 拿锁 过程
1 acquire() 去拿锁
2 用自定义 tryacquire()去拿锁
3 成功 拿到锁 方法退出
4 失败 封装成node 去clh里排队 是不是最后一个
是 死循环 一直等着 自己前面是 头节点
不是 队列是空的 建立一个队列 死循环 一直等着 自己前面是 头节点
aqs 释放资源