网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

Java并发之ReentrantLock类的示例分析-创新互联

这篇文章将为大家详细讲解有关Java并发之ReentrantLock类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

成都创新互联公司基于分布式IDC数据中心构建的平台为众多户提供成都多线服务器托管 四川大带宽租用 成都机柜租用 成都服务器租用。

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的线程。然后将节点上的线程继续执行。

关于“Java并发之ReentrantLock类的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


分享标题:Java并发之ReentrantLock类的示例分析-创新互联
转载注明:http://bjjierui.cn/article/gshjc.html

其他资讯