java-ReentrantLock

ReentrantLock类的两个核心方法

lock 调用的AQS的 acquire方法

unlock 调用的AQS的 realse方法

lock方法执行流程

1. 上来先去尝试抢占锁 如果阻塞队列中没有node等待 获取成功直接返回 

2. 加锁失败(阻塞队列前有node) 会把当前线程封装成node加入阻塞队列 如果是第一个入队的会帮head节点添加一个node

3. 入队成功之后会优化一下当前node与阻塞队列中其他节点的关系,跳过取消状态的节点,进行park阻塞,

4. 被唤醒后会自旋去获取锁,获取失败继续park 获取锁成功 会返回中断状态 

lockInterruptibly方法

跟lock方法很相似,区别是当线程是中断状态的时候抛出中断异常 

进入cancleAcquire方法执行出队的逻辑

分三种情况

1. 被取消的node是tail节点 就用tail指向node的前一个node

2. 如果是阻塞队列中的节点,就用node的前置节点指向node的后置节点 跳过node

3. 如果node的前置节点是head节点,就唤醒node节点的下一个singal节点,这个节点去执行shouldPark..方法让head节点指向这个节点 跳过了被取消的节点

原文地址:https://www.cnblogs.com/isnotnull/p/14604037.html