AQS Lock

ReentrantLock
阻塞队列
共享/独占
公平/非公平
可重入 意义: 在同步方法块中也有可能调用外部方法,外部方法也加了锁,同步方法调用同步方法;如果不可重入将无法保证原子性
允许中断 :线程中的interrupt方法会中断该线程,是一种比较友好的结束线程的方法,在ReentrantLock的CLH队列中,如果线程节点出现异常,那么该节点就没有去获取锁的必要了,所以该节点会被置空,线程对象会被GC回收

 实现原理:

4大关键:
自旋, LocksSuport (阻塞线程),CAS算法(加锁去锁), queue队列

CAS算法:任何时候多线程下只有一个线程可以修改指定的参数

继承了李二狗的AQS并发框架

队列的创建 双向链表 CLH队列  可以从头遍历 从尾部遍历增加性能


几个重要的参数
state:没加锁的前提下默认为0,表示锁没被任何线程持有
阻塞队列的参数
head:指向双向链表队列的头部
tail: 指向双向链表队列的尾部
prev:指向上一个队列节点
next:指向下一个队列节点
thread:將該節點加入隊列的線程。 在構造時初始化並在使用後歸零。


判断锁是否持有锁的方法
首先查看是否能够加锁 即getState 如果为0即可以加锁 接着判断阻塞队列是否有人排队,如果head 和tail (即队列的头部和尾部)相等 ,那么代表没有人排队 直接拿出该线程通过CAS算法加锁 将state改为1,将exclusiveOwnerThread指向得到锁的线程
如果不等于0,判断当前线程是否是持有锁的线程,如果是state+1 (锁的可重入)
如果不是则直接返回false,加锁失败
加锁失败的线程将尝试进入队列


要么加锁成功 tryAcquire 
要么进入队列 acquireQueued(addWaiter(Node.EXCLUSIVE), arg) 

当前那个线程持有锁的指针 exclusiveOwnerThread

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容