Java并发之ReentrantLock类源码解析

 更新时间:2021年06月29日 08:55:30   作者:LaplaceDemon  
这篇文章主要为大家详细介绍了Java并发系列之ReentrantLock源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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互斥锁详解

    Java多线程 ReentrantLock互斥锁详解

    这篇文章主要介绍了Java多线程 ReentrantLock互斥锁详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Lombok和MapStruct整合详情

    Lombok和MapStruct整合详情

    这篇文章主要介绍了Lombok和MapStruct整合详情,文章基于Java的相关资料展开详细内容,需要的小伙伴可以参考一下
    2022-05-05
  • Mybatis-Spring源码分析图解

    Mybatis-Spring源码分析图解

    这篇文章主要介绍了Mybatis-Spring源码分析,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • SpringMVC @GetMapping注解路径冲突问题解决

    SpringMVC @GetMapping注解路径冲突问题解决

    MD5对密码进行加密存储是常见的一种加密方式,本文主要介绍了Java双重MD5加密实现安全登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java入门概念个人理解之package与import浅析

    java入门概念个人理解之package与import浅析

    下面小编就为大家带来一篇java入门概念个人理解之package与import浅析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java虚拟机装载和初始化一个class类代码解析

    Java虚拟机装载和初始化一个class类代码解析

    这篇文章的主要内容是Java虚拟机装载和初始化一个class类的代码解析,包括介绍了装载和初始化的时机与方式,需要的朋友可以参考下。
    2017-09-09
  • java Lombok之@Accessors用法及说明

    java Lombok之@Accessors用法及说明

    这篇文章主要介绍了java Lombok之@Accessors用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 教你在SpringBoot中管理多环境配置文件

    教你在SpringBoot中管理多环境配置文件

    在项目开发中,一般会分为开发环境,测试环境和生产环境.如果总是在一个文件中修修改改,难免会出现错误,尤其是在交接的过程中,一旦出现问题,轻则丢失绩效,重则需要删库跑路.本文则带大家详细了解怎么管理多环境配置文件,需要的朋友可以参考下
    2021-05-05
  • default怎么修饰接口中的方法详解

    default怎么修饰接口中的方法详解

    今天给各位小伙伴们总结一下default怎么修饰接口中的方法,文中有非常详细的图文解说.对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • GC参考手册二java中垃圾回收原理解析

    GC参考手册二java中垃圾回收原理解析

    由于有个垃圾回收机制,java中的额对象不在有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存<BR>
    2022-01-01

最新评论