ReentrantLock基于AQS实现的锁,有公平与非公平两种。默认为非公平。
内部用Sync实现lock及unlock的逻辑,Sync是AQS的子类,Sync子类有公平与非公平实现。
对于非公平实现,lock的基本流程如下:
1.Sync本身调用compairAndSet(0,1),设置当前ReenttrantLock的status为1。
2.设置成功,则将当前锁对象拥有者设置为当前线程。这步表示已经获取到锁,因此直接返回
3.设置失败,这时表示已经存本线程或其它线程占有了锁,这时调用acquire(1)
4.acquire(1)内部会继续尝试获取锁
这里有两种情况,一种是之前拥有锁的线程已经释放锁,这时status为0,对于这种情况重新尝试获取锁,即第 1步操作。
否则判断当前锁拥有者是否为当前线程(即偏向锁的一个实现),如果是则表示当前请求锁的线程就是锁的拥有者,正常返回
如果都不是,则说明锁被其它线程占有着,这时返回
5.如果第4步还是获取不到锁,这时尝试挂起线程,底层会将当前线程加入到CLH队列中,然后将线程挂起。之后的唤醒由锁拥有者释放锁时尝试将队列中的线程唤醒。
时间: 2024-10-22 16:38:20