锁ReentrantLock简述

  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队列中,然后将线程挂起。之后的唤醒由锁拥有者释放锁时尝试将队列中的线程唤醒。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值