Java中synchronized和ReentrantLock锁重入机制详解

在Java中,锁的重入(Reentrancy)是指同一个线程可以多次获取同一把锁而不会造成死锁的特性。这是Java内置锁(synchronized)和ReentrantLock的一个重要特性。

核心概念

当一个线程已经持有某个锁时,它可以再次请求获取这个锁,JVM会记录锁被同一个线程持有的次数,只有当锁完全释放(计数器归零)时,其他线程才能获取该锁。

synchronized的锁重入示例

publicclassReentrantDemo{publicsynchronizedvoidmethodA(){System.out.println("进入methodA");methodB();// 调用另一个同步方法System.out.println("离开methodA");}publicsynchronizedvoidmethodB(){System.out.println("进入methodB");// 做一些操作System.out.println("离开methodB");}publicstaticvoidmain(String[]args){ReentrantDemodemo=newReentrantDemo();// 同一个线程可以重入锁newThread(()->demo.methodA()).start();}}

输出:

进入methodA 进入methodB 离开methodB 离开methodA

ReentrantLock的锁重入示例

importjava.util.concurrent.locks.ReentrantLock;publicclassReentrantLockDemo{privatefinalReentrantLocklock=newReentrantLock();publicvoidouter(){lock.lock();try{System.out.println("外层方法,锁重入计数: "+lock.getHoldCount());inner();// 调用内层方法,重入锁}finally{lock.unlock();}}publicvoidinner(){lock.lock();try{System.out.println("内层方法,锁重入计数: "+lock.getHoldCount());}finally{lock.unlock();}}publicstaticvoidmain(String[]args){ReentrantLockDemodemo=newReentrantLockDemo();demo.outer();}}

输出:

外层方法,锁重入计数: 1 内层方法,锁重入计数: 2

锁重入的实现机制

1. synchronized的实现

  • JVM为每个锁对象维护一个计数器
  • 当线程第一次获取锁时,计数器=1
  • 每次重入,计数器+1
  • 每次退出同步代码块,计数器-1
  • 计数器归零时,锁完全释放

2. ReentrantLock的实现

  • 使用AQS(AbstractQueuedSynchronizer)的state字段记录重入次数
  • 通过getHoldCount()方法可以获取当前线程的重入次数

为什么需要锁重入?

1.避免死锁

// 如果没有锁重入,这段代码会导致死锁publicclassWithoutReentrancy{publicsynchronizedvoida(){b();// 调用另一个同步方法}publicsynchronizedvoidb(){// 一些操作}}

2.支持面向对象的设计

  • 子类可以重写父类的同步方法
  • 方法可以调用其他同步方法
  • 支持递归调用

锁重入的注意事项

1.释放次数必须匹配

publicclassLockReleaseExample{privatefinalReentrantLocklock=newReentrantLock();publicvoidwrong(){lock.lock();lock.lock();// 重入// 业务逻辑lock.unlock();// 只释放一次,锁没有完全释放!}publicvoidcorrect(){lock.lock();lock.lock();// 重入try{// 业务逻辑}finally{lock.unlock();// 释放一次lock.unlock();// 再释放一次}}}

2.可重入锁 vs 不可重入锁

特性可重入锁不可重入锁
同一线程多次获取允许会导致死锁
实现复杂度较高较低
使用场景大多数情况特定场景
Java示例synchronized, ReentrantLock需要自定义实现

实际应用场景

1.递归调用

publicclassRecursiveExample{publicsynchronizedvoidrecursive(intn){if(n<=0)return;System.out.println("递归深度: "+n);recursive(n-1);// 递归调用,需要锁重入}}

2.模板方法模式

publicabstractclassTemplateMethod{publicfinalvoidtemplateMethod(){synchronized(this){doOperation1();doOperation2();// 可能需要锁保护}}protectedabstractvoiddoOperation1();protectedabstractvoiddoOperation2();}

总结

锁重入是Java并发编程中的重要特性,它:

  1. 提高了灵活性:允许方法调用其他同步方法
  2. 避免了自死锁:同一个线程不会因为重复获取锁而阻塞自己
  3. 简化了编程:开发者不需要担心嵌套同步的问题
  4. 支持面向对象设计:便于继承和多态的实现

Java中的synchronized关键字和ReentrantLock都内置了锁重入机制,这也是为什么它们被称为"可重入锁"的原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的锁对象详解

锁是什么&#xff1f; 1. 对于实例方法&#xff08;非static&#xff09; public class Demo {// 实例方法上的synchronizedpublic synchronized void methodA() {methodB(); // 调用另一个synchronized方法}public synchronized void methodB() {// ...} }锁对象 当前实例对…

深度学习毕设选题推荐:基于python深度学习的树叶健康识别人工智能

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java 对接 PLC 实战:西门子 PLC 与永宏 PLC 通讯方式全面对比

下面这篇按“从 0 到能跑通”的思路&#xff0c;把 西门子&#xff08;Siemens&#xff09;PLC 和 永宏&#xff08;FATEK/永宏电机&#xff09;PLC 在 用 Java 对接硬件 时的差异讲清楚&#xff1a;差异到底来自哪里、配置要点是什么、代码通常怎么写、踩坑点有哪些。读完你应…

入校申报审批系统的设计与实现毕业论文+PPT(附源代码+演示视频)

文章目录入校申报审批系统的设计与实现一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;数据库结构与测试用例系统功能结构后端运行截图项目部署源码下载入校申报审批系…

化工TPM预防性维护落地指南:从0到1实现故障降40%

作为化工企业的工程技术人员&#xff0c;你是否经常面临这样的困境&#xff1a;设备故障突发难以预判&#xff0c;熬夜抢修成为常态&#xff1b;维护计划缺乏针对性&#xff0c;过度维护浪费资源、维护不足引发故障。其实&#xff0c;通过科学搭建TPM预防性维护体系&#xff0c…

一篇讲透:芋道源码中的「租户」是如何通过程序控制的?

一、先别急着看代码&#xff1a;什么是「租户」&#xff1f; 1️⃣ 什么是租户&#xff08;Tenant&#xff09;&#xff1f; 在 SaaS 系统 中&#xff1a;租户 一套系统的一个“客户单位”举几个直观例子&#xff1a;一个 OA 系统 A 公司是一位租户B 公司是另一位租户一个进销…

凤希AI伴侣开发手记:那些只有深度使用才暴露的“缺点”

大家好&#xff0c;我是凤希。现在是2026年1月6号晚上七点多&#xff0c;我才开始整理昨天的工作。这几天&#xff0c;我的作息完全颠倒了&#xff0c;经常早上七八点才睡&#xff0c;下午四点才起&#xff0c;活脱脱一个“美国时间”。为啥&#xff1f;因为这几天我几乎把所有…

计算机深度学习毕设实战-基于python深度学习的树叶健康识别机器学习

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

芋道(Ruoyi-Vue-Pro)对接腾讯云短信:没配回调URL,为啥也能看到发送成功/失败?如何排查?

很多人第一次把芋道&#xff08;Ruoyi-Vue-Pro / 芋道源码&#xff09;接到腾讯云短信时&#xff0c;都会遇到一个“看起来矛盾”的现象&#xff1a;我在芋道里没有配置短信回调 URL但在【短信日志】里却能看到&#xff1a; ✅ 发送成功❌ 发送失败同时【接收状态】又常常显示“…

Memcached vs Redis:面试必看的彻底解析

文章目录Memcached 与 Redis 的区别&#xff1f;闫工来告诉你&#xff01;一、Memcached&#xff1a;轻量级缓存界的“闪电侠”1.1 Memcached 的特点1.2 Memcached 的适用场景1.3 Memcached 的配置与使用示例二、Redis&#xff1a;全能型的“瑞士军刀”2.1 Redis 的特点2.2 Red…

ZGLanguage 解析SQL数据血缘 之 提取子查询语句中的源表名

# 假设存在 子查询SQL代码 如下&#xff1a;SELECT CL.OBJECTNO, PP.PAYDATEFROM NYBDP.O_SS_CL_LOAN_ACCT_STATIS CLLEFT JOIN (SELECT AL.PAYDATE, BC.BUSS_NOFROM O_CWWS_ACCT_LOAN ALINNER JOIN NYBDP.O_CWWS_BUSINESS_DUEBILL BDON 11LEFT JOIN O_CWWS_BUSINESS_CONTRACT …

typescript-var和let作用域

什么是作用域&#xff1f;作用域可以理解为某个变量在某个范围内是可以访问到。var是函数作用域&#xff08;声明的函数内&#xff09;、全局作用域&#xff08;在哪里都可以访问到&#xff09;let是块级作用域&#xff08;即程序中的大括号{}包含的范围内&#xff09;看下面的…

高精度双极板体积电阻率测试仪

高精度双极板体积电阻率测试仪 说明高精度双极板体积电阻率测试仪①电阻率ρ不仅和导体的材料有关&#xff0c;还和导体的温度有关。在温度变化不大的范围内&#xff0c;几乎所有金属的电阻率随温度作线性变化&#xff0c;即ρρo(1at)。式中t是摄氏温度&#xff0c;ρo是O℃时…

2026年香港服务器走CN2线路具有哪些优势?

2026 年香港服务器走 CN2 线路具有哪些优势?先说 CN2&#xff0c;CN2 线路作为中国电信的优质网络通道&#xff0c;通过独立路由和优先级保障&#xff0c;为香港服务器赋予了显著优势。1.速度优势&#xff1a;低延迟与高带宽的完美结合CN2线路通过优化路由跳转&#xff0c;大幅…

2026年香港服务器走CN2线路具有哪些优势?

2026 年香港服务器走 CN2 线路具有哪些优势?先说 CN2&#xff0c;CN2 线路作为中国电信的优质网络通道&#xff0c;通过独立路由和优先级保障&#xff0c;为香港服务器赋予了显著优势。1.速度优势&#xff1a;低延迟与高带宽的完美结合CN2线路通过优化路由跳转&#xff0c;大幅…

都在做「WAN优化」,南凌科技的方案究竟有何不同?

在企业数字化转型过程中&#xff0c;WAN优化已成为常见需求。面对市场上众多看似雷同的“降本增效”方案&#xff0c;IT管理者往往难以抉择&#xff1a;究竟哪家能真正解决问题&#xff1f;事实上&#xff0c;许多传统WAN优化方案仅从单点入手&#xff0c;例如数据压缩或协议加…

香港服务器为何需要IPMI?好用吗

在当今数字化时代&#xff0c;香港作为全球重要的数据中心枢纽&#xff0c;其服务器托管服务备受企业青睐。对于使用香港服务器的用户而言&#xff0c;IPMI(智能平台管理接口)是一个关键且实用的技术工具。那么&#xff0c;香港服务器为何需要IPMI?它又是否好用呢?香港服务器…

彻底解决启动问题:如何修复错误代码0xc000000e一站式教程

遇到错误代码0xc000000e可能意味着您的系统启动文件有问题&#xff0c;这可能导致电脑无法正常启动。本文将详细介绍错误代码0xc000000e的原因及其修复方法&#xff0c;帮助您快速恢复电脑正常使用。错误代码0xc000000e通常与什么系统问题相关&#xff1f;1.启动配置数据&#…

喜报!这3本SCI/ESCI成功解除“On Hold”!

据科睿唯安数据库全年更新记录统计&#xff0c;2025年度共668本期刊的变动。其中&#xff0c;新增收录期刊481本&#xff0c;被剔除期刊129本&#xff0c;名称变更期刊58本。被剔除的期刊中&#xff1a;• ESCI&#xff1a;93本&#xff08;占比最高&#xff0c;主要剔除区域&a…

【心脏病检测】基于matlab GUI检测胎儿心脏病【含Matlab源码 14854期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…