ReentrantLock 中的公平锁与非公平锁。大体上的处理流程是一样的,区别点在与,非公平锁在tryAcquire的时候不需要判断AQS 中是否存在其他的等待线程,直接尝试去竞争锁,但是这也是在第一次尝试获取锁的时候允许插队,一旦线程竞争锁失败进入了等待队列,只有其他线程进行unlock解除锁占用的时候才肯能被唤醒,而且唤醒的机制是直接根据AQS等待线程的队列先后顺序唤醒的

大致流程:

1、 尝试获取锁(AQS记录当前线程以及锁的状态),如果获取成功直接向下执行

2、 获取失败后创建Node节点包装线程,并且构建Node 的双向链表

3、 自旋获取锁,失败后进入等待队列并且阻塞

*4、unlock():: 重置AQS锁状态,唤醒队列head节点的线程

发表评论

电子邮件地址不会被公开。 必填项已用*标注