码迷,mamicode.com
首页 > 编程语言 > 详细

Java并发——ReentrantLock类源码阅读

时间:2016-01-25 01:25:21      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

ReentrantLock内部由Sync类实例实现。

技术分享

Sync类定义于ReentrantLock内部。

技术分享

Sync继承于AbstractQueuedSynchronizer。

AbstractQueuedSynchronizer继承于AbstractOwnableSynchronizer。

AbstractOwnableSynchronizer类中只定义了一个exclusiveOwnerThread变量,表示当前拥有的线程。

技术分享

除了Sync类,ReentrantLock内部还定义了两个实现类。

技术分享

NonfairSync是非公平锁。FairSync 是公平锁。

ReentrantLock两个构造方法如下:

技术分享

ReentrantLock的lock方法

技术分享

非公平锁的lock方法

技术分享

compareAndSetState方法是一个CAS方法。该方法尝试去更新对象内的一个变量。变量期望是0,更新为1。

若更新成功,则将exclusiveOwnerThread变量设置为当前线程。然后lock方法会立刻返回。

若更新不成功,则调用acquire(1)。

技术分享

acquire方法中首先调用tryAcquire()再次尝试更新。

非公平锁的tryAcquire()方法如下:

技术分享

非公平锁的tryAcquire()方法内部调用nonfairTryAcquire方法如下:

技术分享

若tryAcquire()方法再次尝试不成功。则首先会调用addWaiter()方法,将当前线程加入等待队列。addWaiter方法返回一个Node节点。

技术分享

返回节点后,acquireQueued(node,1)会再次尝试去做更新。

技术分享

若还是无法更新,则通过parkAndCheckInterrupt将线程挂起。

技术分享

ReentrantLock的unlock方法

技术分享

查看release()方法。

技术分享

若队列的head不为空,且head的等待状态不为0,则调用unparkSuccessor()方法。

unparkSuccessor()方法如下:

技术分享

使node的next从后向前遍历,获取到队列中最前面的一个waitStatus小于0的线程。然后将节点上的线程继续执行。

Java并发——ReentrantLock类源码阅读

标签:

原文地址:http://www.cnblogs.com/shijiaqi1066/p/5156406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!