Java并发之ReentrantLock类源码解析

作者:LaplaceDemon 时间:2022-08-09 18:10:35 

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

标签:Java,并发系列,ReentrantLock
0
投稿

猜你喜欢

  • SpringBoot Validation提示信息国际化配置方式

    2021-08-21 09:27:32
  • Java中的Object类详细介绍

    2023-11-23 23:18:46
  • Java 动态数组的实现示例

    2022-02-27 07:05:25
  • java 模仿拼多多红包递减算法的实现

    2022-05-11 11:03:30
  • Android实现花瓣飘落效果的步骤

    2021-11-23 17:16:44
  • Java反射根据不同方法名动态调用不同的方法(实例)

    2022-05-08 00:51:47
  • 深入探究如何使用Java编写MapReduce程序

    2022-10-17 18:40:04
  • C#利用XML创建Excel文档的实现方法

    2022-12-21 07:15:53
  • 浅谈Java自动装箱与拆箱及其陷阱

    2023-03-22 23:09:23
  • Spring整合Springmvc的相关介绍

    2022-03-30 10:47:08
  • Java基础之堆内存溢出的解决

    2023-11-10 20:06:30
  • Java基于Tcp协议的socket编程实例

    2022-03-08 00:04:13
  • SpringBoot AOP控制Redis自动缓存和更新的示例

    2023-08-31 17:34:37
  • Android使用ViewPager加载图片和轮播视频

    2023-10-26 08:20:04
  • Spring Security UserDetails实现原理详解

    2023-05-07 01:18:21
  • Java如何使用httpclient检测url状态及链接是否能打开

    2022-07-03 21:23:25
  • C#对Json进行序列化和反序列化

    2023-04-16 09:06:15
  • Java如何生成4位、6位随机数短信验证码(高效实现)

    2023-01-24 18:05:20
  • MyBatis 动态SQL和缓存机制实例详解

    2022-01-14 16:47:33
  • Java Swing JComboBox下拉列表框的示例代码

    2022-09-16 00:24:50
  • asp之家 软件编程 m.aspxhome.com