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

详解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()释放锁。

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

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

从mseed到SAC格式转换全攻略:mseed2sac工具安装与批量处理技巧 本文详细介绍了如何将mseed格式的地震数据高效转换为SAC格式,涵盖mseed2sac工具的安装、单文件转换技巧、批量处理自动化实现以及元数据高级处理策略。通过具体命令和脚本示例,帮助地震学研究者快速掌握数据预处理的关键技术,提升波形数据分析效率。 阅读详情

相关推荐

20道SpringSecurity常见面试题汇总(超详细回答 !!!)

本文中,我们将探讨一些与 Spring Security 相关的面试问题。Spring Security 是一款流行的 Java 应用程序安全框架,它提供了一套全面且易于使用的安全解决方案。

小斜同学的博客 3076

什么叫可重入锁

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

爪哇人的博客 1万+

深入解析五大ADC芯片架构及其应用场景

本文深入解析了五大ADC芯片架构及其应用场景,包括逐次逼近型ADC、Σ-Δ型ADC、流水线型ADC、闪存型ADC和积分型ADC。通过详细的架构分析和实际应用案例,帮助工程师理解不同ADC芯片的特点和适用场景,提升电路设计效率。

weixin_28702105的博客 354

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

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

2301_78714573的博客 2617

Python+Selenium实现抖音博主批量监控:300+账号实时更新通知(附完整代码)

本文详细介绍了如何使用Python和Selenium构建一个高可用的抖音博主批量监控系统。通过架构设计、Cookie管理、高效轮询与差异检测等核心模块,实现300+账号的实时更新追踪与通知。文章提供了完整的代码实现,并重点探讨了性能优化、异常处理及服务器部署等实战经验,帮助开发者打造稳定、可控的自动化监控解决方案。

weixin_29274969的博客 192

张量积曲面:数学原理与Python实现

Suv∑i0m∑j0nPij⋅Bipu⋅BjqvSuvi0∑m​j0∑n​Pij​⋅Bip​u⋅Bjq​v其中PijP_{i,j}Pij​是控制点网格,BipuB_i^p(u)Bip​u和BjqvB_j^q(v)Bjq​v是基函数,分别沿uuu和vvv方向定义。

T20151470的博客 1155

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

ReentrantLock、ReentrantReadWriteLock

HK的博客 3419

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

可重入锁理解

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

libing__123的博客 1169

外向交货单批次赋值的标准姿势:用 BAPI_OUTB_DELIVERY_CHANGE 把 LIPS-CHARG 改得稳、改得干净

摘要: 外向交货单批次赋值涉及严格的业务约束,包括批次管理状态、单据状态、拆分规则等,直接更新表 LIPS 不可取。推荐使用 BAPI_OUTB_DELIVERY_CHANGE 接口,通过标准业务逻辑实现批次修改。关键点包括:区分单批次分配与批次拆分场景,正确设置 ITEM_CONTROL 控制结构,并确保单位/数量数据完整。附可直接执行的ABAP代码示例,实现安全可靠的批次更新流程。 (字数:149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 396

28、数字电路测试与半导体内存测试全解析

本文全面解析了数字电路中的顺序电路测试生成方法与半导体内存测试技术。内容涵盖顺序电路中的故障检测、多重观察测试、可驱动性分析、伪组合电路测试及初始化问题,并深入探讨了内存技术发展、故障模型、测试流程与未来趋势。重点介绍了DRAM、SRAM等主流内存类型的特点,以及制造和使用过程中面临的永久性与非永久性故障挑战,提出了基于故障模型的高效测试策略与优化方案。

go5gopher的博客 122

Java锁之可重入锁和递归锁

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

努力努力再努力L 1410

Hindsight 内存爆炸 4 个词排查清单:9,284 条 6 成是 SSH 调试日志——Agent 标签系统的实战复盘

9,284 条记忆里 66% 是 SSH 调试日志。4 个标签被滥用=0 区分度。3 个 entity_labels + retain_mission + retain_every_n_turns 配置把噪声压回 5%——附 PATCH 脚本和实测前后数据。

Starry-SkyJing的博客 57

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

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

泷泷养的乔小胖 904

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JUC之可重入锁(递归锁)

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

ABU_MOlI_ITUI的博客 5375

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

可重入锁(递归锁)

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

我的博客 3488

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

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

可重入锁(递归锁)

可重入锁(递归锁) /** * 可重入锁(递归锁) * 指的是同一线程外层函数获得锁之后,内层函数仍然能自动获取该锁的代码 * 在同一线程,外层函数获得锁的时候,在进入内层函数时会自动获取锁 */ 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、付费专栏及课程。

余额充值