浅谈一下Java中的ReentrantLock

 更新时间:2023年09月27日 10:51:54   作者:缘丶沐逸尘  
这篇文章主要介绍了浅谈一下Java中的ReentrantLock,这个类是JUC工具包中对线程安全问题提供的一种解决方案,它主要是用来给对象上锁,保证同一时间这能有一个线程在访问当前对象,需要的朋友可以参考下

一、ReentrantLock是用来做什么的?

这个类是JUC工具包中对线程安全问题提供的一种解决方案,它主要是用来给对象上锁,保证同一时间这能有一个线程在访问当前对象。这样处理是为了防止如果一个线程对某个公共变量进行了改变,而其它线程读取时读出来的是原有数据导致脏读的问题。

二、ReentrantLock的实现原理是什么?

ReentrantLock主要是通过同步队列和CAS机制来实现的,它实现的过程中主要包含下面几个属性:

  • status:锁状态,0表示没有线程获取锁,1表示已有线程获取锁
  • exclusiveOwnerThread:当前持有锁的线程
  • Node:节点,是ReentrantLock内部维持的一个双向链表(同步阻塞队列)的基本构成

具体流程

1、上锁更新锁状态:当A线程持有锁时,会通过CAS将status状态置为1,并将A线程自身存入exclusiveOwnerThread属性当中;

2、线程入队:而后线程B通过CAS获取锁时发现无法获取锁,此时就会获取node信息,但是由于node双向链表是null所以会通过CAS来创建一个双向链表的head对象,之后再把线程B封装成的Node节点通过尾插法接入双向链表的尾部;

3、线程阻塞:入队完成后再调用park方法进行阻塞;

4、释放锁并更新锁状态:当A线程释放锁时会将status属性重置为0,且把exclusiveOwnerThread置为null;

5、唤醒线程:A线程释放锁完毕后会调用unpark方法来唤醒双向链表中下一节点的线程B;

三、ReentrantLock对比于Synchronized有哪些优缺点?

1、ReentrantLock的锁状态是可见的,而Synchronized的锁状态是不可见的;

2、ReentrantLock是JDK层面的实现,而Synchronized是JVM层面的实现;

3、ReentrantLock需要手动释放锁,而Synchronized不需要手动释放锁;

4、ReentrantLock可以是非公平锁也可以是公平锁,而Synchronized只能是非公平锁;

5、ReentrantLock是可被中断的,而Synchronized是不可悲中断的;

6、Synchronized在特定条件下是后来的线程先获取锁,而ReentrantLock是先来的线程先获取锁;

四、ReentrantLock的简单使用

static ReentrantLock lock = new ReentrantLock();
for (int i = 0; i < 10; i++) {
    Thread thread = new Thread(() -> {
        lock.lock();
        try {
            for (int j = 0; j < 10000; j++) {
                sum++;
            }
        } finally {
            lock.unlock();
            latch.countDown();
        }
    });
    thread.start();
}

到此这篇关于浅谈一下Java中的ReentrantLock的文章就介绍到这了,更多相关浅谈ReentrantLock内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Java类的构造方法详解

    关于Java类的构造方法详解

    这篇文章主要介绍了关于Java类的构造方法详解的相关资料,需要的朋友可以参考下
    2023-01-01
  • 关于springboot打包目录全解析

    关于springboot打包目录全解析

    这篇文章主要介绍了springboot打包目录解析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • java导出生成csv文件的方法

    java导出生成csv文件的方法

    这篇文章主要为大家详细介绍了java导出生成csv文件的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Java获取媒体文件时长的多种实现方法

    Java获取媒体文件时长的多种实现方法

    本文主要介绍了Java获取媒体文件时长的多种实现方法,包括使用第三方库如ApacheCommonsIO、JAVE或FFmpeg,通过这些方法,可以方便地获取不同媒体格式文件的时长,感兴趣的可以了解一下
    2025-11-11
  • Java跳出多重嵌套循环过程解析

    Java跳出多重嵌套循环过程解析

    这篇文章主要介绍了Java跳出多重嵌套循环过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java中输出pdf文件代码分享

    java中输出pdf文件代码分享

    这篇文章主要介绍了java中输出pdf文件代码分享,本文直接给出实现代码,需要的朋友可以参考下
    2015-03-03
  • maven安装、使用、配置本地仓库、idea配置maven以及解决plugins报错问题

    maven安装、使用、配置本地仓库、idea配置maven以及解决plugins报错问题

    本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目时首先会从本地仓库查找资源,如果没有那么Maven会从远程仓库下载到你本地仓库,这篇文章主要给大家介绍了关于maven安装、使用、配置本地仓库、idea配置maven以及解决plugins报错问题的相关资料,需要的朋友可以参考下
    2024-01-01
  • DragChartPanel可拖拽曲线应用详解

    DragChartPanel可拖拽曲线应用详解

    这篇文章主要为大家详细介绍了DragChartPanel可拖拽曲线的应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Mybatis-plus中QueryWrapper的多种用法小结

    Mybatis-plus中QueryWrapper的多种用法小结

    本文主要介绍了Mybatis-plus中QueryWrapper的多种用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java 方法的定义与调用详解

    Java 方法的定义与调用详解

    在java中,方法就是用来完成解决某件事情或实现某个功能的办法。方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本,控制输入或计算数值,这篇文章我们来探究一下方法的定义与调用
    2022-04-04

最新评论