服务器之家

服务器之家 > 正文

Java并发之ReentrantLock类源码解析

时间:2021-04-15 11:44     来源/作者:LaplaceDemon

reentrantlock内部由sync类实例实现。

Java并发之ReentrantLock类源码解析

sync类定义于reentrantlock内部。

Java并发之ReentrantLock类源码解析

sync继承于abstractqueuedsynchronizer。

abstractqueuedsynchronizer继承于abstractownablesynchronizer。

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

Java并发之ReentrantLock类源码解析

除了sync类,reentrantlock内部还定义了两个实现类。

Java并发之ReentrantLock类源码解析

nonfairsync是非公平锁。fairsync 是公平锁。

reentrantlock两个构造方法如下:

Java并发之ReentrantLock类源码解析

reentrantlock的lock方法

Java并发之ReentrantLock类源码解析

非公平锁的lock方法

Java并发之ReentrantLock类源码解析

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

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

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

Java并发之ReentrantLock类源码解析

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

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

Java并发之ReentrantLock类源码解析

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

Java并发之ReentrantLock类源码解析

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

Java并发之ReentrantLock类源码解析

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

Java并发之ReentrantLock类源码解析

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

Java并发之ReentrantLock类源码解析

reentrantlock的unlock方法

Java并发之ReentrantLock类源码解析

查看release()方法。

Java并发之ReentrantLock类源码解析

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

unparksuccessor()方法如下:

Java并发之ReentrantLock类源码解析

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

原文链接:https://www.cnblogs.com/shijiaqi1066/p/5156406.html

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部