面试:什么是可重入性?为什么 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 计数器实现。
不可重入锁会导致:自己锁自己 → 死锁。

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

相关推荐
Aphasia311几秒前
从内存模型看深浅拷贝
前端·javascript·面试
Solis程序员4 分钟前
滑动窗口热键探测与三级缓存设计
java·spring·缓存
好家伙VCC22 分钟前
区块链双向支付通道实战:从签名到结算
java·后端·区块链·asp.net
ss27331 分钟前
【入门OJ题解】分苹果问题(Python/Java/C 实现)
java·c语言·python
嵌入式ZYXC33 分钟前
第1篇:《面试题:画一个STM32最小系统电路,每个元件的作用》
stm32·单片机·嵌入式硬件·面试·职场和发展
weikecms43 分钟前
美团霸王餐报名API接口
java·开发语言
李白的天不白1 小时前
配置mysql密码
java
何中应1 小时前
Nexus如何上传JAR包
java·maven·jar
我登哥MVP1 小时前
Spring Boot 从“会用”到“精通”:参数解析原理
java·spring boot·后端·spring·servlet·maven·intellij-idea
Wenzar_1 小时前
VITS+Whisper微调:低延迟TTS实战
java·人工智能·whisper