首页 > 其他 > 详细

锁ReentrantLock简述

时间:2015-06-19 11:56:50      阅读:117      评论:0      收藏:0      [点我收藏+]

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

   

锁ReentrantLock简述

原文:http://blog.csdn.net/zhaozhenzuo/article/details/46558671

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!