ReentrantLock可重入锁⭐️通过具体案例分析其工作流程以及实现原理

目录

前言

 一、可重入锁的特点

二、原理

        1、ReentrantLock主要利用CAS+AQS队列来实现。

         2、构造方法

2.1 有参数的构造函数,传进去一个true,你就能获得一个公平锁

2.2 无参的构造函数,默认是非公平锁

2.3 构造方法分析

三、工作流程

 四、synchronized,volatile,reentrantLock的区别汇总

 章末


前言

        小伙伴们大家好,上次分析volatile关键字,这次来分析下ReentrantLock,也就是可重入锁

 一、可重入锁的特点

        相比于线程安全中使用的synchronized和volatile关键字,可重入锁的区别如下

  • 可中断
  • 可以设置超时时间
  • 可以设置公平锁
  • 支持多个条件变量
  • synchronized一样,都支持重入

二、原理

        1、ReentrantLock主要利用CAS+AQS队列来实现。

        它支持公平锁和非公平锁,两者的实现类似 构造方法接受一个可选的公平参数(默认非公平锁),当设置为true时,表示公平锁,否则为非公平锁。公平锁的效率往往没有非公平锁的效率高,在许多线程 访问的情况下,公平锁表现出较低的吞吐量。

课代表来了

  • CAS的全称是: Compare And Swap(比较再交换),它体现的一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性。
  • AQS的全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架,
    它是构建锁或者其他同步组件的基础框架
         2、构造方法
2.1 有参数的构造函数,传进去一个true,你就能获得一个公平锁

ReentrantLock可重入锁⭐️通过具体案例分析其工作流程以及实现原理_第1张图片

2.2 无参的构造函数,默认是非公平锁

ReentrantLock可重入锁⭐️通过具体案例分析其工作流程以及实现原理_第2张图片

2.3 构造方法分析

        点进去可以发现公平锁和非公平锁都是继承自同一个父类Sync类,父类点进去查看是继承了AQS类,所以可以说可以得出ReentrantLock底层主要实现就是基于AQS来 实现的

        

ReentrantLock可重入锁⭐️通过具体案例分析其工作流程以及实现原理_第3张图片

三、工作流程

        可重入锁的内部流程大概就是这样,注意使用完不要忘记释放锁

        ReentrantLock reentrantLock = new ReentrantLock();
        try{
            //获取锁
            reentrantLock.lock();
            //执行业务逻辑
        }finally {
            //不要忘了释放锁
            reentrantLock.unlock();
        }
  • 线程来抢锁后使用cas的方式修改reentrantLock对象(锁对象)的state状态,修改状态成功为1,则让锁对象的exclusiveOwnerThread属性指向当前线程,获取锁成功
  • 假如修改状态失败,则会进入双向队列中等待,head指向双向队列头部,tail 指向双向队列尾部
  • exclusiveOwnerThreadnull的时候,则会唤醒在双向队列中等待的线程
  • 公平锁则体现在按照先后顺序获取锁,非公平体现在不在排队的线程也可以抢锁

 四、synchronized,volatile,reentrantLock的区别汇总

synchronized volatile reentrantLock
语法方面

synchronized 是关键字,用于实现同步,在 JVM 中由 C++ 实现

volatile 是关键字,用于标记变量为易变的

ReentrantLock 是 Lock 接口的实现类,由 JDK 提供,用 Java 语言实现

功能方面 进入 synchronized 代码块时会自动获取锁,退出时会自动释放锁 具有可见性和禁止指令重排序的特性。 提供了灵活的加锁和解锁方式,支持公平锁、可中断、超时等特性,以及条件变量等高级功能
性能方面

仅能使用在方法或代码块上,无法实现更复杂的同步需求。

不能实现同步,只能保证可见性,适合于单个变量的读写操作。

需要手动调用 lock 和 unlock 方法来获取和释放锁

什么,表格太繁琐了,不想看,好的来看下面简单的总结

ReentrantLock可重入锁⭐️通过具体案例分析其工作流程以及实现原理_第4张图片

  • synchronized是内置的锁机制,适用于方法和代码块级别的同步,具有自动释放锁的特性。
  • volatile关键字用于保证变量的可见性和禁止指令重排序。
  • ReentrantLock是显式锁,需要手动获取和释放锁,提供了更多高级功能。

 章末

        好了,文章到这里就结束了,下次来分析多线程不可避免的死锁问题 还有高手??死锁是什么锁?有什么作用?


你可能感兴趣的:(Java多线程,java,开发语言)