news 2026/4/16 16:20:47

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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都内置了锁重入机制,这也是为什么它们被称为"可重入锁"的原因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:57:42

notebook的图显示中文的设置

apt updateapt install -y fonts-wqy-microheifc-list | grep -E “WenQuanYi|Noto”清楚缓存 import matplotlib import os import shutil# 获取matplotlib缓存目录 cache_dir matplotlib.get_cachedir() print(f"Matplotlib缓存目录&#xff1a;{cache_dir}")# …

作者头像 李华
网站建设 2026/4/16 2:58:48

一文带你快速了解大模型蒸馏

一文搞懂大模型蒸馏 前言 如今&#xff0c;大模型在自然语言处理、计算机视觉等领域展现出惊人的能力&#xff0c;能处理复杂的任务、输出高质量的结果。但与此同时&#xff0c;大模型的“重量级”特性也带来了不少麻烦&#xff1a;动辄数十亿、上万亿的参数量&#xff0c;需要…

作者头像 李华
网站建设 2026/4/16 12:28:06

NVIDIA Rubin平台重磅亮相CES:六芯协同重塑AI算力,2026下半年量产落地

从行业演进视角来看&#xff0c;CES虽仍冠以消费电子展之名&#xff0c;但如今已成为科技巨头发布前沿算力技术的重要阵地&#xff0c;其技术辐射范围早已突破消费端边界。NVIDIA作为AI算力领域的领军者&#xff0c;此次率先召开芯片厂商发布会&#xff0c;重磅推出下一代Rubin…

作者头像 李华
网站建设 2026/4/16 12:42:49

中小企业服务器托管哪家好?尚航科技综合实力解析

数字化浪潮下&#xff0c;选择一家靠谱的服务器托管商&#xff0c;对中小企业来说至关重要。对于中小企业而言&#xff0c;服务器托管不仅是将服务器放在机房那么简单&#xff0c;它关系到业务连续性、数据安全性和长期成本控制。一个好的IDC服务商能够为企业提供稳定可靠的数字…

作者头像 李华
网站建设 2026/4/16 14:23:29

北京楚珩医疗科技有限公司如何推动新中医事业发展?

公司通过技术创新 、学术创新 &#xff0c;深入中医行业 &#xff0c;做新中医医疗领域领导者 。公司与各大三甲医院权威中医专家合作整理 、持续创新出更加全面的皮内针临床治疗方案 &#xff0c;通过学术交流 、技术培训等方式 &#xff0c;将成熟的实操技术从专业领域普及到…

作者头像 李华
网站建设 2026/4/16 14:28:54

【后端开发面试高频场景题设计题】深度解析| 面试全覆盖

文章目录目录一、 压轴高频场景题深度解析1.1 分布式缓存与数据库的数据一致性保障方案问题描述分析思路参考答案面试考察点面试追问1.2 数据库读写分离方案与实践问题描述分析思路参考答案1.2.1 读写分离核心架构对比1.2.2 主从同步方式对比1.2.3 主从同步延迟的解决方案面试考…

作者头像 李华