面试:什么是可重入性?为什么 synchronized 是可重入锁?

一、什么是可重入性

可重入锁,就是同一个线程在外层方法获取锁之后,再次进入该锁的内层同步代码时,可以直接再次获取锁,不会被自己阻塞。
简单说:自己加的锁,自己可以重复进,不会死锁自己。

二、为什么说 synchronized 是可重入锁

因为 synchronized 底层是基于 Monitor 监视器 + 锁计数器 实现的:

线程第一次获取锁时,计数器置为 1

同一线程再次进入同步代码时,计数器 +1

每退出一层同步代码,计数器 -1

计数器为 0 时,才真正释放锁

所以同一个线程可以重复获取同一把锁,不会产生死锁,因此 synchronized 是可重入锁。

用代码举个例子就是:

复制代码
public class Test {
    public synchronized void a() {
        b(); // 同一线程,再次进入 synchronized
    }

    public synchronized void b() {
        // ...
    }
}

调用 a() 时线程已经获取锁,再调用 b() 不会阻塞,这就是可重入。

顺便记一个加分点:
ReentrantLock 也是可重入锁,原理一样,靠 AQS 里的 state 计数器实现。
不可重入锁会导致:自己锁自己 → 死锁。

而对于这种不可重入锁最通用的解决办法就是使用可重入锁,通过记录锁持有线程和计数器,避免同一线程重复加锁时被阻塞。

相关推荐
Escalating_xu15 分钟前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅40 分钟前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路1 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData1 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat1 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰2 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
考研保研资料分享2 小时前
2022环境工程保研北师大:三校专业追问、论文贡献与择校复盘
面试
Flynn Liang2 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞2 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长2 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统