码迷,mamicode.com
首页 > 其他好文 > 详细

锁ReentrantLock简述

时间:2015-06-19 11:59:36      阅读:179      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!