什么是可重入锁(递归锁)

详解ReentrantLock---可重入锁(小白易懂) ReentrantLock是可重入的互斥锁,虽然具有与synchronized相同功能,但是会比synchronized更加灵活(具有更多的方法)。ReentrantLock底层基于AbstractQueuedSynchronizer实现 阅读详情

可重入锁(Reentrant Lock),也称为递归锁,是一种支持同一个线程多次获取同一个锁的锁机制。

在并发编程中,当一个线程获得了锁之后,如果再次尝试获取同一个锁时,可重入锁会允许该线程继续获取锁而不会被阻塞。这种机制允许线程在执行过程中多次获取同一个锁,并且在释放锁之前需要相同次数的解锁操作。

可重入锁的主要目的是解决在递归调用或嵌套代码中的锁定问题。当一个线程已经获得了锁,但在持有锁的代码块中又调用了另一个需要同样锁的方法时,如果使用非可重入锁,线程会因为无法再次获得同一个锁而陷入死锁状态。而可重入锁允许线程多次获得同一个锁,避免了死锁问题。

可重入锁的实现通常会记录持有锁的线程和持有锁的次数。当线程再次请求获取锁时,会检查当前线程是否已经持有锁,如果是,则增加持有锁的计数器;否则,线程会被阻塞直到获取到锁。

在Java中,ReentrantLock类是可重入锁的一种实现方式。它提供了与synchronized相似的功能,但具备更高的灵活性和扩展性。通过调用lock()方法获取锁,再调用unlock()方法释放锁,可以实现多次获取和释放同一个锁的操作。

可重入锁的使用可以简化代码逻辑,提高灵活性,并且能够避免死锁问题。然而,需要注意避免过度的锁嵌套,以免引起性能问题或潜在的死锁风险

下面是有关递归锁的例子:

假设有一个账户类(Account),其中包含了一个余额(balance)属性和对该余额进行操作的方法(如存款和取款)。我们可以使用可重入锁来保护对账户余额的并发访问。

import java.util.concurrent.locks.ReentrantLock;

public class Account {
    private double balance;
    private ReentrantLock lock;

    public Account(double initialBalance) {
        this.balance = initialBalance;
        this.lock = new ReentrantLock();
    }

    public void deposit(double amount) {
        lock.lock(); // 获取锁
        try {
            balance += amount;
        } finally {
            lock.unlock(); // 释放锁
        }
    }

    public void withdraw(double amount) {
        lock.lock(); // 获取锁
        try {
            if (balance >= amount) {
                balance -= amount;
            } else {
                System.out.println("Insufficient balance.");
            }
        } finally {
            lock.unlock(); // 释放锁
        }
    }

    public double getBalance() {
        return balance;
    }
}

 

在上述代码中,我们使用了ReentrantLock来创建一个可重入锁(lock)。在存款(deposit)和取款(withdraw)方法中,首先使用lock.lock()获取锁,然后执行相应的操作,最后使用lock.unlock()释放锁。

这样,当多个线程同时对同一个账户进行存款或取款操作时,可重入锁确保只有一个线程能够访问账户的余额,并且不会发生并发冲突。同一个线程在执行完一次操作后,可以继续获取同一个锁进行下一次操作,而不会被阻塞。

使用可重入锁可以保证线程安全性,避免数据竞争和并发冲突的问题。

FastDDS之共享内存 transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。 阅读详情

相关推荐

STM32H743内存告急?手把手教你用CubeMX+FMC外扩32MB SDRAM(W9825G6KH-6)

本文详细介绍了如何在STM32H743上使用CubeMX和FMC外扩32MB SDRAM(W9825G6KH-6),解决内存不足问题。从硬件选型、CubeMX配置到初始化代码实现,提供完整的配置教程和性能优化技巧,帮助开发者高效扩展内存,适用于图形界面和复杂算法处理。

weixin_30568591的博客 493

什么叫可重入锁

可重入性:就是一个线程不用释放,可以重复的获取一个锁n次,只是在释放的时候,也需要相应的释放n次。(简单来说:A线程在某上下文中或得了某锁,当A线程想要在次获取该锁时,不会应为锁已经被自己占用,而需要先等到锁的释放)假使A线程即获得了锁,又在等待锁的释放,就会造成死锁。 注意:synchronized和reentrantlock都是可重入锁 synchronized: 无需释放锁,synchronized会自动释放锁 public static void main(String[] arg

爪哇人的博客 1万+

谈谈 FOC和BLDC 电机控制

更具体地说,通过 “Park 变换”,我们可以把三相交流电流信号转换成两相直流电流信号,从而可以把三相交流电机的控制变得和两相直流电机控制一样简单。在内环 “电流环”中,一些比较重要的模块有 “Clark 变换” 和 “Park 变换” 等数学模块、电机电流信号检测模块以及能够提供电机的转速和转角位置信息的模块。日前,Qorvo 电机控制应用高级系统/应用工程师张绍发表了一个与 BLDC 和 FOC 相关的演讲,科普了 FOC 的相关知识,还讲解了 Qorvo 用于简化 FOC 实施方案的方法。

U_YAO的博客 2116

什么是可重入,什么是可重入锁? 它用来解决什么问题?

从早期的经典 I/O 到后来引入的 NIO(New Input/Output),Java 提供了多种方式来处理文件、网络等数据流。假设我们使用的是非可重入锁(如早期的 synchronized 键),当 outerMethod 获取锁后,innerMethod 再次尝试获取锁时会导致死锁,因为锁已经被当前线程持有。Java 的经典 I/O 模型(也称为阻塞 I/O)是基于流(Stream)的。可重入锁主要用于解决多线程环境下的资源竞争问题,同时避免因锁的不可重入性导致的死锁问题。

2301_78714573的博客 2617

避坑指南:Win11修改用户文件夹名称后,如何彻底解决残留文件与路径错误?

本文针对Win11用户修改用户文件夹名称后遇到的残留文件与路径错误问题,提供了一套完整的解决方案。从诊断进程占用、使用资源监视器与命令行强力清理,到修复系统环境变量与软件配置,并详细介绍了创建符号链接这一终极兼容方案,帮助用户彻底解决路径依赖问题,恢复系统稳定。

pz890123的博客 833

避开这5个坑!STC8H DMA串口通信的实战避坑指南(115200波特率实测)

本文深入解析了STC8H单片机利用DMA实现稳定全双工串口通信的实战要点。针对115200高波特率场景,详细拆解了DMA-UART架构、关键寄存器配置、时钟精度计算、缓冲区管理及中断协同等核心环节,并提供了具体的避坑指南和调试方法,帮助开发者构建高效可靠的通信链路。

melon的博客 675

多线程(五)可重入锁、读写锁

ReentrantLock、ReentrantReadWriteLock

HK的博客 3419

泛微E9集成登录实战:5分钟搞定第三方系统单点登录配置(附避坑指南)

本文详细解析了泛微E9集成登录的实战配置流程与核心原理。通过理解其基于信任代理的身份传递机制,文章指导用户如何在5-10分钟内完成第三方系统的单点登录对接,涵盖基础配置、核心参数设置、高级表达式应用,并提供了编码问题、账号不一致等常见避坑指南,助力企业快速构建统一身份认证门户。

weixin_29185493的博客 289

可重入锁理解

可重入锁就是一个线程执行一段同步代码时(被synchronized修释的),执行过程中其中又碰到了一段同步方法(被synchronized修释的),由于刚执行外层同步方法时外层方法内所有代码已被加锁,所以内层同步方法已被加锁,执行到内层同步方法时,又被加了一次锁。父类的某个方法被synchronized修释的,子类中对他进行了重写,也被synchronized修释。子类中重写的方法还调用了父类中被重写的方法。总之就是外层方法是同步方法,内层方法也是同步方法。执行外层方法时,当执行到内层方法时就是重入了。

libing__123的博客 1169

FPGA 学习笔记:Vivado 工程更改FPGA 型号

FPGA 学习笔记:Vivado 工程更改FPGA 型号

坚韧与专注 1万+

【YOLO目标检测全栈实战】98 YOLO模型在低光照环境下的自适应增强策略

你有没有遇到过这种情况?深夜加班调试产线检测模型,车间灯光昏暗,摄像头采集的图片黑乎乎一片,YOLO模型直接“罢工”——漏检率飙升到40%以上。上个月我在一个汽车零部件质检项目里就栽了跟头:白天模型跑得飞起,mAP@0.5达到0.92,可一到夜班,同样的产线、同样的零件,mAP直接掉到0.63。客户拍着桌子问我:“你这模型怎么还分白天黑夜?”

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 284

Java锁之可重入锁和递归锁

Java锁之可重入锁和递归锁 目录 Java锁之可重入锁和递归锁基本概念 Java锁之可重入锁和递归锁代码验证 小结 理论,代码,小结,学习三板斧。 1. Java锁之可重入锁和递归锁基本概念 可重入锁(也叫递归锁),指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也即是说,线程可以进入任何一个它己经拥...

努力努力再努力L 1410

【同等学力】2005-数学⭐✨

有r个正方形排成一行,今用红、黄、白、蓝四种颜色给这个r个正方形染色,每个正方形只能染一种颜色,如果要求染红、黄、白色的正方形分别至少出现一个,问有多少种不同的染法?3、(4分)设G是一个有n个结点m条边的连通简单平面图,若n≥3,则m≤3n-6.4、(4分)证明:任何连通简单平面图至少有一个结点的度数不超过5

super_mochi1 306

java之可重入锁和递归锁理论知识

大厂面试题:公平锁/非公平锁/重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。大厂面试题:公平锁/非公平锁/重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。 1、什么是可重入锁(递归锁) 可重入锁(也叫递归锁):指的是同一线程外层函数获得锁之后,内层递归函数仍然可以获取该锁的代码,在同一线程在外层方法获取锁的时候+,在进入内层方法会自动获取锁。 也就是说,线程可以...

泷泷养的乔小胖 904

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JUC之可重入锁(递归锁)

可重入锁(又名递归锁) 理论 指的是同一线程外层函数获得锁之后,内层递归函数仍然能够获得该锁的代码 在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁 也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块 ReentrantLock/synchronized就是一个典型的可重入锁 作用:避免死锁 代码 synchronized就是一个典型的可重入锁案例 pa...

ABU_MOlI_ITUI的博客 5375

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

可重入锁(递归锁)

可重入锁 synchronized 和Lock都是可重入锁,也叫递归锁,即一个线程可以重复获取同一把锁 是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。 Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。 synchronized 是隐式锁,Lock是显式锁 即synchronized 加锁解锁自动完成 Lock加锁解锁要手动完成 synchron

我的博客 3488

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

可重入锁(递归锁)

可重入锁(递归锁) /** * 可重入锁(递归锁) * 指的是同一线程外层函数获得锁之后,内层函数仍然能自动获取该锁的代码 * 在同一线程,外层函数获得锁的时候,在进入内层函数时会自动获取锁 */ class Phone{ Lock lock = new ReentrantLock(); //**************************************...

明天请叫我早点起床的博客 204

可重入锁和递归锁

可重入锁也称递归锁。 可重入锁指的是同一个线程进入外层函数获得锁,内层同步函数仍然可以使用该锁,并且不会发生死锁。ReentrantLock和synchronized默认都是可重入锁。 class Phone implements Runnable{ //可重入锁 ReentrantLock Lock lock = new ReentrantLock(); ...

时光吹老了好男孩 234

3、可重入锁,又名递归锁

可重入锁/(递归锁)(默认是非公平锁) * 公平锁:先来后到 * 非公平锁:可能由县级翻转或者饥饿现象(后来的先获得锁) * synchronized 天生的可重入锁 * 定义: 线程可进入任何一个已经拥有锁的同步着的代码块 package com.example.study01.common.LockDemo; import java.u...

转身那一瞬 167

java-15种锁之可重入锁(又名递归锁)

1、什么是可重入锁(递归锁) 可重入锁(也叫递归锁):指的是同一线程外层函数获得锁之后,内层递归函数仍然可以获取该锁的代码,在同一线程在外层方法获取锁的时候+,在进入内层方法会自动获取锁。 也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。 2、可重入锁(递归锁)举例 进入method1方法跟进入method2方法获取的是同一把锁 public s...

lixinkuan的博客 1896

【JUC】 什么是可重入锁和递归锁

可重入锁和递归锁ReentrantLock 概念 可重入锁就是递归锁 指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取到该锁的代码,在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取锁 也就是说:线程可以进入任何一个它已经拥有的锁所同步的代码块 ReentrantLock / Synchronized 就是一个典型的可重入锁 代码 可重入锁就是,在一个method1方法中加入一把锁...

qq_17831715的博客 280

可重入锁(又名递归锁)

可重入锁 指的是同一线程外层函数获得锁之后,内层递归函数仍能获取该锁的代码,在同一线程的外层获取锁的时候,在进入内层方法会自动获取锁,也就是说线程可以任意进入它已经拥有的锁的同步代码块。 synchronized 是一个典型的重入锁 使用synchronized 实现代码如下: public class ReenterLockDemo { public static void main(S...

weixin_44226334的博客 336

Java中的锁机制——可重入锁(递归锁)

目录 什么是可重入锁(递归锁) sychronized版 lock版 为什么可重入锁能防止死锁 什么是可重入锁(递归锁) 可重入锁也叫递归锁。它指的是同一个线程在外层获取锁之后,内层方法也会自动获取锁。lock和sychronized都是可重入锁 可重入锁最大的作用就是避免死锁 看这个小例子,method01和02都是加锁的方法,根据可重入锁的原理,线程只要获得了01的锁就能访问02,即使02也是个带锁的方法。 sychronized版 一...

我能在河边钓一整天的鱼 540

Java锁:可重入锁(递归锁)

可重入锁 也叫递归锁:递归传递同一把锁 理解: 同一个线程在进入外层同步方法获得锁之后,同样可以进入该外层同步方法中所拥有的内层同步方法,它们此时所拥有的是同一把锁 这种设计可以避免死锁(如果不是可重入锁,在进入外层同步方法之后,无法进入该外层同步方法所拥有的内层同步方法,这种情况下就会出现死锁) synchronized/ReentrantLock都是可重入锁 代码示例和解释: import j...

qq_41477034的博客 461

可重入锁(递归锁)的理解

1.什么是可重入锁? 可重入锁,也称递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍能能获取该锁。同一个线程中,在外层方法获取锁后,进入内层方法会自动获取锁。线程可以进入任何一个它已经拥有的锁所同步着的代码块。 ReentrantLock、Synchronized 都是典型的可重入锁。 2.可重入锁有什么作用? 可重入锁最大的作用就是可以避免死锁。 ...

白茶 1055

Java锁 可重入锁(递归锁) 深入源码解析 ReentrantLock synchronized

当执行monitorenier时,如果目标锁对象的计数器为零,那么说明它没有被其他线程所持有,Java虚拟机会将该锁对象的持有线程设置为当前线程,并且将其计数器加1。是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还。在目标锁对象的计数器不为零的情况下,如果锁对象的持有线程是当前线程,那么Java虚拟机可以将其计数器加1,否则需要等待。每个锁对象拥有一个锁计数器和一个指向持有该锁的线程的指针。自己可以获取自己的内部锁。

多多的博客 616
上一篇: 什么是乐观锁,什么是悲观锁,有什么作用,该如何使用
下一篇: 什么是自旋锁SpinLock
小小懒懒
博客等级 码龄5年 449粉丝 312原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小懒懒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值