首页 > 编程语言 >java中ReentrantLock底层实现原理

java中ReentrantLock底层实现原理

时间:2023-08-06 14:01:41浏览次数:42  
标签:java AQS Thread lock ReentrantLock 获取 线程 底层

ReentrantLock是Java中提供的一种可重入的互斥锁,它具有与synchronized关键字相似的功能,但更加灵活和可控。下面是ReentrantLock底层实现原理的简要解释: ReentrantLock的底层实现主要依赖于AbstractQueuedSynchronizer(AQS)类。AQS是一个用于构建锁和其他同步器的框架,它提供了一种基于FIFO等待队列的同步机制。 ReentrantLock通过AQS实现了公平锁和非公平锁两种模式。在公平锁模式下,线程按照申请锁的顺序依次获取锁;而在非公平锁模式下,线程可以通过抢占的方式获取锁,不保证顺序。 当一个线程想要获取锁时,首先会尝试通过CAS(Compare and Swap)操作来修改AQS的状态值,将锁的状态设置为1,表示该线程已经获取到锁。如果CAS操作失败,说明有其他线程已经获取到了锁,当前线程会进入等待状态。 当一个线程释放锁时,它会调用AQS的release方法来释放锁资源。释放锁的过程主要包括将锁的状态设置为0、唤醒等待队列中的下一个线程,并将其从等待队列中移除。 ReentrantLock还支持可重入的特性,即同一个线程可以多次获取同一个锁,而不会造成死锁。ReentrantLock内部维护了一个计数器,记录了当前线程获取锁的次数。只有当计数器为0时,其他线程才能获取到锁。 总结来说,ReentrantLock底层实现通过AQS类提供了一种基于FIFO等待队列的同步机制,通过CAS操作来控制锁的获取和释放。同时,它还支持公平锁和非公平锁两种模式,并具备可重入的特性。这些特性使得ReentrantLock在多线程环境下能够更加灵活和可控地进行同步操作。

以下是一个使用ReentrantLock的示例代码:

javaCopy codeimport java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
    private static final ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) {
        Thread thread1 = new Thread(new Worker());
        Thread thread2 = new Thread(new Worker());
        thread1.start();
        thread2.start();
    }
    static class Worker implements Runnable {
        @Override
        public void run() {
            lock.lock(); // 获取锁
            try {
                // 执行需要同步的操作
                System.out.println("线程" + Thread.currentThread().getId() + "正在执行任务");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock(); // 释放锁
                System.out.println("线程" + Thread.currentThread().getId() + "释放了锁");
            }
        }
    }
}

上面的代码中,使用了一个静态的ReentrantLock对象作为锁。在Worker类的run方法中,首先使用lock.lock()获取锁,然后执行需要同步的操作,最后使用lock.unlock()释放锁。 两个线程都会执行相同的任务,但由于使用了ReentrantLock,只有一个线程可以获取到锁,另一个线程会在lock.lock()处等待,直到第一个线程释放锁才能继续执行任务。 这样可以保证同一时刻只有一个线程在执行任务,实现了线程间的互斥操作。同时,由于ReentrantLock是可重入的,同一个线程可以多次获取同一个锁而不会造成死锁。

标签:java,AQS,Thread,lock,ReentrantLock,获取,线程,底层
From: https://blog.51cto.com/u_15702012/6983973

相关文章

  • 【JAVA】如何学好Java并调整学习过程中的心态
    学习Java是一项挑战性而又值得追求的目标。掌握Java编程语言,不仅可以为您的职业发展增添新的机会,还能让您体验到编程的乐趣。本文将为您提供学习Java的有效方法,并探讨调整学习过程中心态的关键。第一步:建立坚实的基础在开始学习Java之前,建立坚实的基础至关重要。学习Java编程语言......
  • 【JavaScript05】Object的序列化与反序列化
    对象的序列化当我们需要像后端传json字符串的时候,需将JavaScript的对象转成json格式,这个过程就是序列化。varp={name:"肖文亮",age:18,wife:{name:"XXX",age:18,hobby:[......
  • 【JavaScript04】Object对象
    对象(object)是JavaScript最重要的数据类型,也是JavaScript的核心内容。JavaScript中一切皆对象,比如String、Array、Date等对象。在JavaScript中,对象是非常重要的,当你理解了对象,就可以了解JavaScript。语法:对象字面量的属性名可以加引号,也可以不加,建议不加如果要使用一......
  • 【JavaScript03】Array数组对象基本操作
    首先定义一个数组,可以用[];也可以使用newArray()来创建一个数组对象数组通过下标取值数组通过下标取值,从0开始在python中可以通过下标-1反着取倒数第一个值,JavaScript中没这种取值方法.当数组的下标不在它取值范围内,如x有4个成员,那么取值是0-3,非0-3的数字下标取值,得到......
  • k8s实战案例之运行Java单体服务-jenkins
    1、jenkins架构基于java命令,运⾏javawar包或jar包,本次以jenkins.war包部署⽅式为例,且要求jenkins的数据保存⾄外部存储(NFS或者PVC),其他java应⽤看实际需求是否需要将数据保存⾄外部存储。从上述架构图可以看到,Jenkins通过k8s上的pv/pvc来连接外部存储,通过svc的方式向外暴露......
  • JavaWeb之Servlet入门版教务系统(二)
    本次要分享的内容是之前教务系统中系统管理模块下的角色列表功能,包括对角色信息进行增删改查以及对当前的用户进行角色的分配(重点讲解)。首先还是需要使用mysql数据库准备一张角色表,建表语句如下:DROPTABLEIFEXISTS`sys_role`;CREATETABLE`sys_role`(`role_id`int(11)NO......
  • 【JavaScript02】数据类型
    前言JavaScript数据类型可以分为基本类型和对象类型两大类基本类型:字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。对象类型:对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。typeof查看数据类型......
  • javascript 文本校验框
     编辑实现效果:编辑编辑<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content=&......
  • Java入门
    java类 类里面存在变量和方法变量又称为“属性”,主要有类变量,实例变量,局部变量 实例变量实例变量在类里面(不在方法里面),不可以直接使用,要在方法里面调用输出!格式为:变量类型(当前类名)变量名称(随便)=new变量类型();System.out.println(变量类型.属性);如:Demo08zmz=ne......
  • 【JavaScript01】简介与声明变量
    前言JavaScript是Web的编程语言。所有现代的HTML页面都使用JavaScript。JavaScript简介JavaScript的学习分三个部分:1、核心(ECMAScript):JavaScript的核心,描述了语言的基本语法和数据类型。ECMAScript是一套标准,定义了一种语言的标准与具体实现无关。2、文档......